UITextField的数字键盘:点而不是浮点值的逗号
我正在使用从数字键盘填充的textField。
麻烦的是,有很多本地区域格式(比如所有欧洲人),UITextField的数字键盘都有逗号而不是点号,所以每次我写一个十进制数字时,UITextField都不能识别小数点的逗号和它的整数。 例如23,07变成23。
我该如何解决这个问题? 我以为把textField设置为固定在美国; 可能吗? 怎么样?
我使用这个读取值:
var importo = (importoPrevistoTF.text as NSString).floatValue
潜在的重复的SO答案 ,使用NSNumberFormatter
Swift示例:
let number = NSNumberFormatter().numberFromString(numberString) if let number = number { let floatValue = Float(number) }
示例(Objective-C):
NSNumber *number = [[NSNumberFormatter new] numberFromString: numberString]; float floatValue = number.floatValue;
这已经被问及在这里回答。 您可以使用逗号和句点进行操作,如下所示:
更新: Swift 3.0.2•Xcode 8.2.1
extension String { var floatValue: Float { let nf = NumberFormatter() nf.decimalSeparator = "." if let result = nf.number(from: self) { return result.floatValue } else { nf.decimalSeparator = "," if let result = nf.number(from: self) { return result.floatValue } } return 0 } }
Swift 2
extension String { var floatValue: Float { let nf = NSNumberFormatter() nf.decimalSeparator = "." if let result = nf.numberFromString(self) { return result.floatValue } else { nf.decimalSeparator = "," if let result = nf.numberFromString(self) { return result.floatValue } } return 0 } } "23.07".floatValue // 23.07 "23,07".floatValue // 23.07
没有人真的直接处理这个问题。
也就是说,小数点分隔符是语言环境的约定。
iOS支持基于特定语言环境的格式化数字。
如果你纯粹的工作在一个给定的地区,那么一切都应该正常工作。 键盘应该接受带有正确小数点的数字。
例如,如果您在欧洲的大多数国家/地区,则input逗号作为小数点分隔符。 在这些国家input一个点是错误的。 来自其中一个国家的人不会这样做,因为这是错误的小数点分隔符。 欧洲用户将会知道使用逗号作为小数点分隔符,而不必做任何事情。
如果你在美国,你会用一段时间。 在美国使用逗号是错误的。
你应该显示一个十进制数的方式是使用数字格式化程序。 当你创build一个数字格式化程序时,它默认使用当前的语言环境。
如果您需要将包含十进制数字的string从一种语言环境转换为另一种语言环境,则应该使用2个数字格式化程序。 使用源语言环境中的格式化程序将string转换为浮点数。 然后使用目标语言环境的格式化程序将数字转换为输出格式的string。
只需在默认的当前语言环境中创build一个数字格式化程序,然后创build第二个数字格式程序,并将其语言环境明确地设置为您要使用的其他语言环境。
这可能是这个答案的重复,但由于原来在Objective-C,这里是一个Swift版本:
let label = "23,07" let formatter = NSNumberFormatter() let maybeNumber = formatter.numberFromString(label) if let number = maybeNumber { println(number) // 23.07 }
Swift 3:用逗号包含浮点数的string的浮点数或双精度值
extension String { var floatValue: Float { let nf = NumberFormatter() nf.decimalSeparator = "." if let result = nf.number(from: self) { return result.floatValue } else { nf.decimalSeparator = "," if let result = nf.number(from: self) { return result.floatValue } } return 0 } var doubleValue:Double { let nf = NumberFormatter() nf.decimalSeparator = "." if let result = nf.number(from: self) { return result.doubleValue } else { nf.decimalSeparator = "," if let result = nf.number(from: self) { return result.doubleValue } } return 0 } }
例:
"5,456".floatValue //5.456 "5.456".floatValue //5.456 "5,456".doubleValue //5.456 "5.456".doubleValue //5.456 "5,456".doubleValue.rounded() //5 "5,6".doubleValue.rounded() //6
let number = NSNumberFormatter() let locale = NSLocale.currentLocale() let decimalCode = locale.objectForKey(NSLocaleDecimalSeparator) as! NSString number.decimalSeparator = decimalCode as String let result = number.numberFromString(textField.text!) let value = NSNumberFormatter.localizedStringFromNumber(result!.floatValue, numberStyle: .DecimalStyle) print(value)
希望,这可以帮助你:)
由于NSNumberFormatter在最近版本的Swift中被NumberFormatter所取代,所以我很乐意与您分享一个升级的可能解决scheme:
var numberFormatter: NumberFormatter() importo = Float(numberFormatter.number(from: importoPrevistoTF.text!)!)
我find了一个解决scheme:
let nf = NumberFormatter() nf.locale = Locale.current let numberLocalized = nf.number(from: txtAlcool.text!)
在我的情况下,我正在testing的Xcode和一切ok,但在设备上testing时,它崩溃了。 所有,因为在巴西我们使用公制系统,逗号分隔的十进制“,”。 有了这个解决scheme,它会自动从逗号转换为点。