본문 바로가기
iOS_Swift 앱개발👍

[iOS_Swift] TextField 천의 자리마다 (,)콤마 찍기_ 24

by 개발하는윤기사 2022. 10. 3.
728x90
반응형

안녕하세요 이웃님들!! 개발하는 윤기사입니다~

 

최근 개인 앱 출시 준비하느라 블로그에 소홀했던 점!! 죄송합니다...ㅠ.ㅠ (너무 바빴어요...🥲)

 

그래서 오늘부터 올려드리는 포스팅들은 개인 앱 출시 준비하면서 어려움을 겪었던 부분을 하나씩 올려드리려고 합니다!

 

첫 번째, 바로 시작해보시죠! 텍스트 필드에 천의 자리마다 쉼표를 찍는 방법입니다.

 

 

 

복리 계산기 탭!

 

제가 만들었던 앱 중에 한 가지 메뉴인 복리 계산기 탭입니다. 

 

TextField의 원금과 이자율, 투자기간은 모두 숫자이기 때문에 천의 자리마다 (,) 콤마가 필요했습니다.

 

 

1. 사용하고자 하는 ViewController에 텍스트 필드 딜리 게이트를 선언합니다. 함수는 <shouldChangeCharactersIn>을 이용합니다.

extension CaculateViewController: UITextFieldDelegate {
    
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
      
        // 여기 안에다가 내용 삽입

        return true
        
    }
}

 

2. 그 안에 NumberFormatter를 설정해줍니다.

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.locale = Locale.current
formatter.maximumFractionDigits = 0 //소수점을 몇 번째 자리까지 표시할 지 정하는 것.

 

3. 그리곤 TextField 안에 text를 검사합니다. 내용인 text가 숫자인지 아닌지, 비어있는지 아닌지를 검사합니다.

 if let removeAllSeprator = textField.text?.replacingOccurrences(of: formatter.groupingSeparator, with: ""){
            var beforeForemattedString = removeAllSeprator + string
            if formatter.number(from: string) != nil {
                if let formattedNumber = formatter.number(from: beforeForemattedString), let formattedString = formatter.string(from: formattedNumber){
                    textField.text = formattedString
                    return false
                }
            } else {
                if string == "" {
                    let lastIndex = beforeForemattedString.index(beforeForemattedString.endIndex, offsetBy: -1)
                    beforeForemattedString = String(beforeForemattedString[..<lastIndex])
                    if let formattedNumber = formatter.number(from: beforeForemattedString), let formattedString = formatter.string(from: formattedNumber){
                        textField.text = formattedString
                        return false
                    }
                } else {
                    return false
                }
            }
            
        }

 

4. 마지막으로 딜리게이트를 self로 연결해줍니다.

TextField.delegate = self

 

 

< 전체 코드 >

extension CaculateViewController: UITextFieldDelegate {
    
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        formatter.locale = Locale.current
        formatter.maximumFractionDigits = 0
        
        if let removeAllSeprator = textField.text?.replacingOccurrences(of: formatter.groupingSeparator, with: ""){
            var beforeForemattedString = removeAllSeprator + string
            if formatter.number(from: string) != nil {
                if let formattedNumber = formatter.number(from: beforeForemattedString), let formattedString = formatter.string(from: formattedNumber){
                    textField.text = formattedString
                    return false
                }
            } else {
                if string == "" {
                    let lastIndex = beforeForemattedString.index(beforeForemattedString.endIndex, offsetBy: -1)
                    beforeForemattedString = String(beforeForemattedString[..<lastIndex])
                    if let formattedNumber = formatter.number(from: beforeForemattedString), let formattedString = formatter.string(from: formattedNumber){
                        textField.text = formattedString
                        return false
                    }
                } else {
                    return false
                }
            }
            
        }
        
        return true
        
    }
}

 

 

전체 코드를 복사 붙여 넣기만 하셔서 TextField에 딜리 게이트 연결만 해주신다면 천의 자리마다 콤마가 잘 찍히는 걸 확인하실 수 있습니다!

 

오늘 개발하는 윤기사는 여기서 포스팅을 마치겠습니다!

728x90
반응형