5

我的目标很简单,我有一个存储本地化货币值的文本字段(例如 $1,000.00),我需要从文本字段中取回该值作为浮点数,以便对文本字段执行一些测试。

代码非常简单,首先我将 NSNumber 格式化为本地化字符串,如下所示:

NSNumberFormatter* formatter = [[NSNumberFormatter alloc] init];
formatter.locale = [NSLocale currentLocale];
formatter.numberStyle = NSNumberFormatterCurrencyStyle;
textfield.text = [formatter stringFromNumber:number];

一切正常,但是我做相反的事情来从这个本地化字符串中获取 doubleValue :

NSNumberFormatter* formatter = [[NSNumberFormatter alloc] init];
formatter.locale = [NSLocale currentLocale];
formatter.numberStyle = NSNumberFormatterCurrencyStyle; //also tested with NSNumberFormatterDecimalStyle

double d = [formatter numberFromString:textfield.text].doubleValue;

问题是格式化程序只返回我的字符串的整数值而不是小数,更糟糕的是,如果它是加拿大本地化字符串(20 000,00 $),它只返回 20。

我已经搜索了一段时间,但找不到任何关于这种行为的信息。解决方法当然是在将 NSNumber 格式化为文本字段之前存储它,然后测试这个 nsnumber,但我真的不觉得它漂亮。

4

3 回答 3

3

在 Swift 中,您可以通过类似的方式将语言环境设置为货币格式,然后获取双精度:

    var locale = NSLocale.currentLocale()
    var formatter = NSNumberFormatter()
    formatter.locale = NSLocale(localeIdentifier: "en_US")
    formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle

    var moneyDouble = formatter.numberFromString(textField.text)?.doubleValue
于 2014-10-26T02:30:55.790 回答
1

正如 Giuseppe 指出的那样,答案非常简单,我因为没有考虑而将头撞在墙上。

double d = [NSDecimalNumber decimalNumberWithString:textfield.text locale:[NSLocale currentLocale]].doubleValue;
于 2012-11-14T13:11:47.533 回答
0

对 zavtra 的答案的略微增强,它返回一个浮点数并且不强制语言环境标识符为en_US(Swift 2):

func floatFromTextFieldText() -> Float {
    let formatter = NSNumberFormatter()
    formatter.locale = NSLocale.currentLocale()
    formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
    guard let amount = self.text else { return 0.0 }
    return formatter.numberFromString(amount)!.floatValue
}
于 2016-02-16T20:19:49.827 回答