文本格式文本字段swift

我正在尝试格式化文本字段。 它应包含数字,并且必须始终以“00”结尾。 如果用户10输入文本应该始终在10.00结束。 我尝试了这个,但没有得到他想要的结果:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { let numberFormatter = NSNumberFormatter() numberFormatter.numberStyle = .DecimalStyle numberFormatter.minimumFractionDigits = 2 numberFormatter.maximumFractionDigits = 2 let textValue = Double(textField.text!) textField.text = numberFormatter.stringFromNumber(textValue!) return true } 

现在很混乱

从您提供的代码开始,它崩溃的原因由编译器给出:“致命错误:在展开Optional值时意外发现nil。” textValuenil因为当引入第一个字符时, textField为空,从空字符串获取double的结果为nil

另请注意,即使一切都正确,您也应该返回false以便您可以在textField中进行更改。

关于解决方案,我不确定我是否理解你的问题,所以我在这里提出两个解决方案:

S1:您想要更改文本字段,因此它始终以##。00格式显示数字,其中#是任意数字。

用户输入1并显示1.00。 请注意,这样就不可能有这样的东西:10.50或2.35。

 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { var originalString = textField.text! var replacedString: String! // Deleting text if string.isEmpty { // Delete the first caracter before .00 let loc = originalString.characters.count - 4 let range = NSMakeRange(loc, 1) replacedString = (originalString as NSString).stringByReplacingCharactersInRange(range, withString: "") if replacedString == ".00" { textField.text = "" return false } replacedString = formatNumberFromString(replacedString) textField.text = replacedString return false } if originalString.isEmpty { // If we want to avoid having zeros before the dot. Ex.: 000.00 if string == "0" { return false } replacedString = string + ".00" textField.text = replacedString return false } else { // Original string has the format ###.00 originalString = originalString.stringByReplacingOccurrencesOfString(".00", withString: "") replacedString = originalString + string + ".00" // Format number replacedString = formatNumberFromString(replacedString) textField.text = replacedString return false } // For any other UITextField's return true } func formatNumberFromString(var stringNumber: String) -> String { if stringNumber.isEmpty { return "" } // Replace any formatting commas stringNumber = stringNumber.stringByReplacingOccurrencesOfString(",", withString: "") let doubleFromString = Double(stringNumber) let finalString = numberFormatter.stringFromNumber(doubleFromString!) return finalString! } 

S2:您想要更改文本字段,因此它总是有两个小数位。

如果用户输入1,则显示0.01。 接下来3,它显示0.13,7 – > 1.37,依此类推。

 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { var originalString = textField.text // Replace any formatting commas originalString = originalString!.stringByReplacingOccurrencesOfString(",", withString: "") var doubleFromString: Double! if originalString!.isEmpty { originalString = string doubleFromString = Double(originalString!) doubleFromString! /= 100 } else { if string.isEmpty { // Replace the last character for 0 let loc = originalString!.characters.count - 1 let range = NSMakeRange(loc, 1) let newString = (originalString! as NSString).stringByReplacingCharactersInRange(range, withString: "0") doubleFromString = Double(newString) doubleFromString! /= 10 } else { originalString = originalString! + string doubleFromString = Double(originalString!) doubleFromString! *= 10 } } let finalString = numberFormatter.stringFromNumber(doubleFromString) textField.text = finalString return false } 

另请注意,我将NSNumberFormatter初始化程序移到这些函数之外,因为这是一项耗时的操作。

 class ViewController: UIViewController, UITextFieldDelegate { @IBOutlet weak var textField: UITextField! let numberFormatter = NSNumberFormatter() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. self.textField.delegate = self numberFormatter.numberStyle = .DecimalStyle numberFormatter.minimumFractionDigits = 2 numberFormatter.maximumFractionDigits = 2 } // ... } 

我希望这有助于解决您的问题。

建议将文本转换为实际数字并使用NSNumberFormatter并设置minimumFractionDigitsminimumFractionDigits 。 一个例子:

 let numberFormatter = NSNumberFormatter() numberFormatter.locale = NSLocale.currentLocale() numberFormatter.numberStyle = .DecimalStyle numberFormatter.minimumFractionDigits = 2 numberFormatter.maximumFractionDigits = 2 textField.text = numberFormatter.stringFromNumber(#your number#)