在 Objective-C 中将货币字符串转换为浮点数

Posted

技术标签:

【中文标题】在 Objective-C 中将货币字符串转换为浮点数【英文标题】:Convert currency string into float in Objective-C 【发布时间】:2012-11-14 12:55:28 【问题描述】:

我的目标很简单,我有一个存储本地化货币值(例如 $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,但我真的不觉得它漂亮。

【问题讨论】:

你可以看到 [Obtaining an NSDecimalNumber from a locale specific string][1] about [1]: ***.com/questions/317311/… 【参考方案1】:

在 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

【讨论】:

【参考方案2】:

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

double d = [NSDecimalNumber decimalNumberWithString:textfield.text locale:[NSLocale currentLocale]].doubleValue;

【讨论】:

如果您的原始价格字符串包含货币符号(例如:@"$9.99"),那么 zvtra 的答案是正确的(使用 NSNumberFormatter)。【参考方案3】:

对 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

【讨论】:

以上是关于在 Objective-C 中将货币字符串转换为浮点数的主要内容,如果未能解决你的问题,请参考以下文章

无法在python中将字符串转换为浮点数

在 C++ 中将字符串转换为浮点数

ValueError:无法在熊猫中将字符串转换为浮点数

如何在 JavaScript 中将字符串转换为浮点数?

如何在python中将23位浮点数从字符串转换为浮点数并返回?

在 Apple Swift 中将字符串转换为浮点数产生的值与模块错误不同