为货币格式化UITextField

我有一个UITextField在我的应用程序只接收来自用户的数字input。 此数字input表示货币,并具有默认值0.00。

我想创build一个像掩码的东西来格式化用户input数字的UITextField。 例如:

9成为$ 0.09 99成为$ 0.99999成为$ 999,99

下面的代码工作得很好,但是因为我使用整数和浮点值,应用程序最终会显示错误的值。 例如:

999999999变成了100000000

发生这种情况是因为flot和integer不够精确,应该使用NSDEcimalNumber。 重点是,我不知道如何将我的整数和浮点值replace为NSDecimalNumber。

有没有人可以帮我解决这个问题? 我花了一些时间在网上search解决scheme,但没有find适合我的需求和吨的人有同样的问题。

这里是代码:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (textField.tag == 1){ NSString *cleanCentString = [[textField.text componentsSeparatedByCharactersInSet: [[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""]; NSInteger centValue= cleanCentString.integerValue; if (string.length > 0) { centValue = centValue * 10 + string.integerValue; } else { centValue = centValue / 10; } NSNumber *formatedValue; formatedValue = [[NSNumber alloc] initWithFloat:(float)centValue / 100.0f]; NSNumberFormatter *_currencyFormatter = [[NSNumberFormatter alloc] init]; [_currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]; textField.text = [_currencyFormatter stringFromNumber:formatedValue]; return NO; } if (textField.tag == 2){ // Nothing for now } return YES; } 

您可以通过以下方式将整数或double / float值转换为string:

 NSString *str = [@(myInt) stringValue]; NSString *str1 = [[NSNumber numberWithFloat:myFloat] stringValue]; 

之后,您可以通过多种方式将string转换为NSDecimalNumber。 喜欢:

 NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"100.1"]; NSLog(@"%@", number); NSDecimalNumber *num = [NSDecimalNumber decimalNumberWithString:@"100.1" locale:NSLocale.currentLocale]; NSLog(@"%@",num); NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; [formatter setNumberStyle:NSNumberFormatterDecimalStyle]; [formatter setLocale:[NSLocale currentLocale]]; NSLog(@"%@", [formatter stringFromNumber:number]); 

NSNumberFormatter将帮助你正确的格式。 请阅读苹果页面的NSDecimalNumber和NSNumberFormatter 。 NSNumberFormatter包含一个名为“configuration货币格式”的部分。 我没有尝试,但似乎可以帮助你。

让我知道如果这有助于.. 🙂

实现UITextFieldDelegate并添加下面的方法:

迅速:

 let currencySign = "$" // Adds $ before the text, eg "1" -> "$1" and allows "." and "," func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { var value = textField.text var newString = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string) var components = newString.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "1234567890,.").invertedSet) var decimalString = "".join(components) as NSString var length = decimalString.length if length > 0 { value = "\(currencySign)\(decimalString)" } else { value = "" } textField.text = value } // Formats final value using current locale, eg "130,50" -> "$130", "120.70" -> "$120.70", "5" -> "$5.00" func textFieldDidEndEditing(textField: UITextField) { var value = textField.text var components = value.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "1234567890,.").invertedSet) var decimalString = "".join(components) as NSString let number = NSDecimalNumber(string: decimalString, locale:NSLocale.currentLocale()) var formatter = NSNumberFormatter() formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle formatter.locale = NSLocale.currentLocale() if let formatedValue = formatter.stringFromNumber(number) { textField.text = formatedValue } else { textField.text = "" } }