텍스트필드 숫자 입력 관련 질문

태그: 

1 답변 글타래를 보이고 있습니다
  • 글쓴이
    • c00012
      참가자
      • 글작성 : 17
      • 답글작성 : 5

      3개의 텍스트 필드에서 숫자를 입력받아 결과를 계산하는 코드를 다음과 같이 만들었습니다.

      @IBAction func Estimate(_ sender: UIButton) {

              var payAmt:Double = 0.0 //월 지급액

              LoanAmt = Double(txtAmt.text!)!

              LoanRate = Double(txtRate.text!)!

              LoanDuration = Int(txtDuration.text!)!

              let ratemonthly = LoanRate/12.0/100

                      let Durationinmonth = LoanDuration * 12

                      let numerator = LoanAmt * ratemonthly * pow(1 + ratemonthly, Double(Durationinmonth))

                      let denominator = pow(1 + ratemonthly, Double(Durationinmonth)) – 1

              payAmt = numerator / denominator

              numformatter.numberStyle = .decimal

              txtResult.text = “대출금을 갚으려면 월 (numformatter.string(for: Int(payAmt))!)원만큼을 (Durationinmonth)개월동안 내야합니다.”

          }

      위 코드 외에 텍스트필드에서 숫자를 입력받는 대로 천자리에 콤마를 찍는 코드 또한 아래와 같이 만들었습니다.

      func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

                  // replacementString : 방금 입력된 문자 하나, 붙여넣기 시에는 붙여넣어진 문자열 전체

                  // return -> 텍스트가 바뀌어야 한다면 true, 아니라면 false

                  // 이 메소드 내에서 textField.text는 현재 입력된 string이 붙기 전의 string

                  

                  let formatter = NumberFormatter()

                  formatter.numberStyle = .decimal // 1,000,000

                  formatter.locale = Locale.current

                  formatter.maximumFractionDigits = 0 // 허용하는 소숫점 자리수

                  

                  // formatter.groupingSeparator // .decimal -> ,

                  

                  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

              }

      코드를 실행해보니 입력은 내가 의도했던 대로 되는데  

      LoanAmt = Double(txtAmt.text!)! 

      이 부분에서 값을 받지 못하고 에러를 뱉어내네요. 원인은 아무래도 세자리 콤마찍는 함수인 거 같은데 왜 그러는지를 모르겠어서 이걸 어떤식으로 해결해야 할지 조언 좀 부탁드립니다… 

      • 이 게시글은 c00012에 의해 6 months, 1 week 전에 수정됐습니다.
    • GyooWoon
      참가자
      • 글작성 : 2
      • 답글작성 : 3

      txtAmt가 텍스트 필드인가요?

      텍스트 필드에 세 자리수 마다 콤마찍는 기능을 구현하셨다고 했는데

      콤마라는 문자열이 포함된 숫자를 Double로 변환 하는 과정에서 콤마는 수로 변환할 수 없어서 에러를 뱉어낸게 아닌가 싶네요

      • c00012
        참가자
        • 글작성 : 17
        • 답글작성 : 5

        님의 지적이 맞았습니다. 원인은 콤마 때문이었네요.

        그래서 코드를 콤마 빼는 값을 변수에 assign하는 것으로 고쳐서 해결했습니다.

        지적에 감사드립니다.

1 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom