2017-11-23 3 views
0

UITextField에 입력 한 텍스트의 형식을 지정하려는 문제를 해결하기 위해 SO에서 일부 코드를 빌려 수정했습니다. .decimalnumberStyleNumberFormatter이면 제대로 작동하지만 (쉼표가 필요한 곳에 추가합니다.) .currency을 사용하면 앱을 실행 한 후에 아무 것도 입력 할 수 없습니다. UITextField이 채워지지 않습니다.NumberFormatter()의 .currency 형식을 사용할 때 UITextField를 채울 수 없습니다.

로케일을 가지고 놀아 보았는데 아무 것도 해결하지 못했습니다.

내가 원하는 모두는 즉시 그것은 또는 I '는 digitsOnly 확장자없이 그 일 년대 UITextField

에 입력을 시작으로 사용자에게 그들이 입력 한 숫자 앞에 "$"기호를 표시하는 것입니다 나는 그것을 사용하고있는 것 같지 않습니다.

관련 코드 :

case annualBill!: 
    if isNumeric { 
     let formatter = NumberFormatter() 
     formatter.numberStyle = .currency 
     formatter.currencySymbol = "$" 

     let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string) 
     let numberWithOutCommas = newString.replacingOccurrences(of: ",", with: "") 
     let number = formatter.number(from: numberWithOutCommas) 
     if number != nil { 
      let formattedString = formatter.string(from: number!) 
      textField.text = formattedString 
      values.annualBill = Decimal(string: (textField.text?.digitsOnly)!) 
      print(values.annualBill ?? "NA") 
     } else { 
      textField.text = nil 
     } 

extension String { 
    var digitsOnly: String { 
     return components(separatedBy: 
    NSCharacterSet.decimalDigits.inverted).joined(separator: "") 
     } 
    } 

답변

0

텍스트 필드 대리인에서 사용해보십시오.

var amountString = "" 

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

    if !string.isValidCharacterForCurrency() { 
     return false 
    } 

    let formatter = NumberFormatter() 
    formatter.minimumFractionDigits = 2 
    formatter.maximumFractionDigits = 2 

    if string.count > 0 { 
     amountString += string 
     let decNumber = NSDecimalNumber(string: amountString).multiplying(by: 0.01) 
     let newString = "$" + formatter.string(from: decNumber)! 
     textField.text = newString 

    } 
    else { 

     amountString = String(amountString.dropLast()) 
     if amountString.count > 0 { 
      let decNumber = NSDecimalNumber(string: amountString).multiplying(by: 0.01) 
      let newString = "$" + formatter.string(from: decNumber)! 
      textField.text = newString 
     } 
     else { 
      textField.text = "$0.00" 
     } 
    } 
    return false 
} 
extension String { 

    func isValidCharacterForCurrency() -> Bool { 

     let intValue = Int(self) 
     return !(intValue == 0 && self != "0" && self != "") 
    } 
} 
+0

'string'은 배열이 아니기 때문에'.count' 메소드를 가지고 있지 않습니다. – Grimes47

+0

아, 그것을 얻었습니다. 그것은 .characters.count입니다. 'dropLast' 메소드와 동일합니다. 나는 지금 일하고있다. 내가 100 %에 이르면 업데이트됩니다. 감사. – Grimes47

+0

내 특정'switch' 문에 대해 몇 가지 수정 작업을하게되었습니다. 감사!! – Grimes47

0

확장에이 코드를 시도하고 함께 사용하여 newString하고, 가장 잘 못해 사전에

를 형식을 확인해야하므로 number with decimal 키보드를 사용하는 등 USD로 currencyCode에
public func toCurrencyFormatter(with currencyCode: String) -> String { 
     if NSDecimalNumber(string: self) != NSDecimalNumber.notANumber { 
      let formatter = NumberFormatter() 
      formatter.numberStyle = .currency 
      formatter.currencyCode = currencyCode 
      guard let formattedStr = formatter.string(from: NSDecimalNumber(string: self)) else { return self } 
      return formattedStr 
     } 
     return self 
    } 
+0

내'newString' 선언의 끝에서 직접 그것을 실행시겠습니까? 왜냐하면 나는 그것을 시도 할 때'UITextField'를 전혀 입력 할 수 없기 때문입니다. 'textField.text' 속성을'formattedString? .CurrencyFormatter (with : "USD")와 함께 지정하면 첫 번째 숫자가 제대로 표시됩니다 (즉, 4가 $ 4.00로 표시됨). 그러나 키보드의 다른 숫자를 누르면 필드를 초기화합니다. – Grimes47

관련 문제