2016-12-21 2 views
0

Я пытаюсь создать UITextField, где вход постоянно отображается в формате валюты, даже если пользователь редактирует. Он должен работать как:Отображение UITextField в формате без децимал

$0 

типа пользователя 1

$1 

типа пользователя 2

$12 

типа пользователя 0

$120 

типа пользователя 0

$1,200 

тип пользователя 0

$12,000 

мне удалось получить окончательное форматирование с помощью NumberFormatter как

textField.text = (numberFormatter.string(from: NSNumber(value: Int(textField.text!)!)))?.components(separatedBy: ".")[0] 

Но как только я форматировать текст в текстовом поле, последующий ввод вызовет ошибку, как:

$1,000 

пользовательский тип 0

$1,0000 //number formatter cannot recognise this as a format of currency 

Есть в любом случае я могу манипулировать вход, чтобы позволить пользователю нужно только ввести в цифрах, но значение отображается в правильной валюте форматирования с символом плюс запятыми - например, $ 1200000. Независимо от количества цифр, но логически до 10 достаточно.

Мой текущий TextField shouldChangeCharactersInRange как это:

textField.text = numberFormatter.number(from: textField.text!)?.description 

    if(range.length == 1){ //Backspace 
     if(textField.text?.characters.count == 1){ 
      textField.text = "$0" 
      return false 
     } 
     return true 
    } 
    if(string.trimmingCharacters(in: CharacterSet.decimalDigits.inverted) == ""){ 
     textField.text = (numberFormatter.string(from: NSNumber(value: Int(textField.text!)!)))?.components(separatedBy: ".")[0] 
     return false 
    } 
    if(string == ".") { 
     textField.text = (numberFormatter.string(from: NSNumber(value: Int(textField.text!)!)))?.components(separatedBy: ".")[0] 
     return false 
    } 

    textField.text = (numberFormatter.string(from: NSNumber(value: Int(textField.text!.append(string)!)!)))?.components(separatedBy: ".")[0] 
    return false 
+0

Также был бы благодарен, если кто-нибудь может дать советы, чтобы помочь мне уменьшить количество скобок и сделать код выглядеть чище, без необходимости добавлять слишком много строк. –

ответ

1

Попробуйте ниже код

extension ViewController: UITextFieldDelegate { 

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

     let text: NSString = (textField.text ?? "") as NSString 
     let finalString = text.replacingCharacters(in: range, with: string) 

     // 'currency' is a String extension that doews all the number styling 
     amountTextField.text = finalString.currency 

     // returning 'false' so that textfield will not be updated here, instead from styling extension 
     return false 
    } 
} 

extension String { 
    var currency: String { 
     // removing all characters from string before formatting 
     let stringWithoutSymbol = self.replacingOccurrences(of: "$", with: "") 
     let stringWithoutComma = stringWithoutSymbol.replacingOccurrences(of: ",", with: "") 

     let styler = NumberFormatter() 
     styler.minimumFractionDigits = 0 
     styler.maximumFractionDigits = 0 
     styler.currencySymbol = "$" 
     styler.numberStyle = .currency 

     if let result = NumberFormatter().number(from: stringWithoutComma) { 
      return styler.string(from: result)! 
     } 

     return self 
    } 
} 
+0

Это умно!Я продолжал думать о том, чтобы использовать число форматирования для поддержания своей строки, я полностью упустил эту возможность –

+0

Добро пожаловать – Matt

0

Вы можете использовать leftView и rightView свойства UITextField, как показано ниже: Это будет только заботиться о отображения знака «$» слева от входа поле.

override func viewDidLoad() { 
     super.viewDidLoad() 

     let label = UILabel(frame: CGRect(x :0,y :0,width :10,height: 10)) 
     label.text = "$" 

     self.moneyTextField.leftViewMode = .always 
     self.moneyTextField.leftView = label 

    } 
+0

На самом деле, у меня не так много проблем с символом валюты, так как форматирование чисел поможет позаботиться об этом. Это запятая "," что у меня проблемы. Он сломает форматирование после того, как пользователь наберет более 4 цифр в –

2
// ViewController.swift 
// TextfieldDemo 
// 
// Created by piyush sinroja on 21/12/16. 


import UIKit 

class ViewController: UIViewController, UITextFieldDelegate { 

    @IBOutlet weak var txtDigit: UITextField! 

    var strDigit: String = String() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     let label = UILabel(frame: CGRect(x :0,y :0,width :10,height: 10)) 
     label.text = "$" 
     self.txtDigit.leftViewMode = .always 
     self.txtDigit.leftView = label 

     txtDigit.layer.cornerRadius = 4.0 
     txtDigit.layer.masksToBounds = true 
     txtDigit.layer.borderColor = UIColor.lightGray.cgColor 
     txtDigit.layer.borderWidth = 1.0 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func textFieldDidBeginEditing(_ textField: UITextField) { 

    } 

    func textFieldDidEndEditing(_ textField: UITextField) { 

    } 

    func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     return true 
    } 

    func textField(_ textFieldToChange: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
     if textFieldToChange == txtDigit{ 
      let aSet = NSCharacterSet(charactersIn:"").inverted 
      let compSepByCharInSet = string.components(separatedBy: aSet) 
      let numberFiltered = compSepByCharInSet.joined(separator: "") 

      if numberFiltered == "" { 
       let new = txtDigit.text! 
       let fsf = new.substring(to: new.index(new.endIndex, offsetBy: -1)) 
       let currentString = fsf 
       let findStr = commaStrSet(currentString: currentString) 
       txtDigit.text = findStr 
       return false 
      } 
      else{ 
       let currentString = (textFieldToChange.text! as NSString) 
        .replacingCharacters(in: range, with: string) 
       let findStr = commaStrSet(currentString: currentString) 
       txtDigit.text = findStr 
      } 
     } 
     return false 
    } 

    func commaStrSet(currentString: String) -> String { 
     var replaceStr = currentString.replacingOccurrences(of: ",", with: "") 
     let length = replaceStr.characters.count 
     switch length { 
     case 4: 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 1)) 
     case 5: 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 2)) 
     case 6: 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 1)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 5)) 
     case 7: 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 2)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 5)) 
     case 8: 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 1)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 4)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 7)) 
     case 9: 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 2)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 5)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 8)) 
     case 10: 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 1)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 4)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 7)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 10)) 
     case 11,12,13,14,15: 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 1)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 4)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 7)) 
      replaceStr.insert(",", at: replaceStr.index(replaceStr.startIndex, offsetBy: 10)) 
     default: 
      break 
     } 

     return replaceStr 
    } 
} 
+0

выше кода работает на 100% –

+0

Я пробовал коды, и кажется, что смещение неверно, и я попытался исправить его. Спасибо за помощь. –

+0

нет работающий. Я сделал только для вас, вы можете использовать свою собственную логику –

Смежные вопросы