阅读完NSNumberFormatter的Apple文档here后,我正在尝试根据Uber API文档转换货币。两个文档都声明它们使用ISO格式标准,但是在我的代码中我发现情况并非如此。 ISO 4217标准here 并在ISO itself
public static func convertStringCurrencyToNumber(strCurrency:String, locale:String)->Double {
var formatter = NSNumberFormatter()
formatter.locale = NSLocale(localeIdentifier: "\(locale)")
formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
println(formatter.numberFromString(strCurrency))
if let converted:Double = formatter.numberFromString(strCurrency)?.doubleValue {
return converted
}else{
return 0.0
}
}
我的单位测试此功能
func testCurrencyConversion() {
let fiveBucks = UberReceipt.convertStringCurrencyToNumber("$5.00", locale: "en_US")
println(fiveBucks)
let tenBucks = UberReceipt.converStringCurrencyToNumber("$10.00", locale:"USD")
println(tenBucks)
}
控制台日志: 可选(5.0) 零 5 0.0
如果我使用“en_US”结果是预期的,那将是5.0,但是如果我使用Uber返回的语言环境“USD”,则返回值为0.0。在打印/检查格式化器转换货币时发生的情况时,我发现它返回nil。
我发现文档误导了它对formatter.locale = NSLocale(...)的说法。根据文档“语言环境确定许多格式化程序属性的默认值,例如ISO国家/地区和语言代码,货币代码 ....”
我认为设置区域设置应该也设置货币代码。这是不正确的?如果我使用与ISO代码相关的非标准“en_US”代码(这应该是Apple文档使用的那样),为什么我的代码会工作“USD”
答案 0 :(得分:5)
public static func convertStringCurrencyToNumber(strCurrency:String, locale:String)->Double {
var formatter = NSNumberFormatter()
formatter.currencyCode = locale
formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
if let converted:Double = formatter.numberFromString(strCurrency)?.doubleValue {
return converted
}else{
return 0.0
}
}
将formatter.locale更改为formatter.currencyCode,ISO 4127国家和货币代码“USD”按预期工作。
答案 1 :(得分:0)
正如Zoff Dino所说,USD不是有效的区域设置标识符。要获得完整列表,您可以运行:
NSLocale.availableLocaleIdentifiers()
您设置区域设置货币代码是正确的。试试例如:
let l = NSLocale(localeIdentifier: "de_CH")
let f = NSNumberFormatter()
f.locale = l
f.currencyCode // Playground shows CHF
区域设置定义了正确的字母顺序,千位分隔符,时间和日期格式,货币代码和其他内容。您传入的内容不是区域设置,而是货币代码。如果要从货币代码构造区域设置,可以从NSLocale.availableLocaleIdentifiers()
的输出和生成的货币代码创建查找表。
如果您澄清API返回的确切内容以及您想要使用它做什么,这可能会有所帮助。