4

나는 이것에 대한 해결책을 찾기 위해 머리를 찢어 버렸다.UITextField를 가격으로 형식 지정하기 (XXX, XXX.XX)

단순히 UITextField가 입력 된 숫자를 가격으로 올바르게 포맷하기를 원합니다. 즉 소수점 하나만 허용됩니다. 두 자리 뒤에 입력하면 (예 : 입력 한 경우) ','를 사용하여 큰 숫자 (예 : 150,000)를 구분할 수 있습니다.

가격이 적절하게 형식이 지정되는 이유는 무엇입니까? 그렇다면 왜 그렇게 어려운 일입니까?

가장 가까운 해결책은 this code입니다. 그러나 문제는 4 자리 숫자를 입력하면 0으로 되돌아갑니다. 이것은 해결책에 가깝습니다. 왜 이상한 행동을하는지 이해할 수 없습니다.

+0

빠른 질문 : 사용자가 글을 쓰거나 Enter/Next를 누른 다음 변경 하시겠습니까? – Can

+0

사용자가 (실시간) 변경 중일 때. –

답변

1

실제로이 코드는 필요하지 않습니다. nib 파일의 텍스트 필드에 숫자 포맷터를 드래그하고 "통화"스타일을 사용하도록 구성하십시오.

코드를 통해이

[myNumberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle] 가격의 형식은 지역에 따라 매우 다르다는 것을주의 할 것이다. 예를 들어, 독일에서는 점을 천 단위 구분 기호로 사용하고 콤마를 소수점으로 사용합니다. 고정 된 형식 대신 스타일을 사용하면 이러한 차이점을 처리합니다.

+0

Err 어디서 드래그 할 숫자 포맷터를 찾을 수 있습니까? 나는 그것을 볼 수 없어? 둘째, shouldChangeCharactersInRange가 발생할 때 번호를 업데이트합니까? –

+0

포맷 된 번호가 "라이브"로 업데이트 될 필요가 없습니다. 이 경우 내 대답은 도움이되지 않습니다. 미안합니다. – omz

0

안녕하세요. 내 솔루션입니다.

import UIKit 


extension Numeric { // for Swift 3 use FloatingPoint or Int 

    func currency(locale: String, symbol: Bool = true) -> String { 
     let formatter = NumberFormatter() 
     formatter.numberStyle = .currency 
     formatter.locale = Locale(identifier: locale) 
     if !symbol { 
      formatter.currencySymbol = "" 
     } 
     let result = formatter.string(for: self) ?? "" 

     return result 
    } 

} 

의 ViewController 코드

var price: String! 
var priceNumber: CGFloat! 
@IBOutlet weak var priceInput: UITextField! 

viewDidLoad에 귀하의 ViewController에서

priceInput.addTarget(self, action: #selector(priceInputChanged), for: .editingChanged) 
priceInput.tintColor = .clear 

priceInput.delegate = self 

UITextFieldDelegate

@objc func priceInputChanged(_ textField: UITextField){ 

    if localIdentifier != nil { 
     priceInput.text = priceNumber.currency(locale: localIdentifier, symbol: false) 
    } 
} 
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 

    if textField.tag == 3 { 

     if string.isEmpty { 
      if price.count > 0 { 
       let last = price.removeLast() 
       if last == "." { 
        if price.count > 0 { 
         price.removeLast() 
        } 
       } 
      } 

     }else { 
      price.append(string) 
     } 

     if let input = price { 
      let n = NumberFormatter().number(from: input) ?? 0 
      priceNumber = CGFloat(truncating: n) 

      if localIdentifier != nil { 
       priceInput.text = priceNumber.currency(locale: localIdentifier, symbol: false) 
      } 

     } 

    } 

    return true 
} 

That 's It

관련 문제