阅读了Apple NSNumberFormatter的文档这里后,我正试图按照Uber API文档将货币进行转换。两个文档都声明使用ISO格式标准,但在我的代码中,我发现这并不是事实。ISO 4217标准在这里,以及ISO 本身。
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)
}
控制台日志: Optional(5.0) nil 5.0 0.0
如果我使用 "en_US",结果如预期的那样是 5.0,但是如果我使用 Uber 返回的语言环境 "USD",返回值为 0.0。在打印/检查格式化程序转换货币时发生了什么之后,我发现它返回 nil。
我发现文档对于 formatter.locale = NSLocale(...) 的说明有误导性。根据文档 "语言环境确定许多格式化程序属性的默认值,例如 ISO 国家和语言代码,货币代码..."
我认为设置语言环境 应该 也会设置货币代码。这是不正确的吗?那么为什么我的代码可以使用非标准的 "en_US" 代码而不是 ISO 代码(苹果文档所使用的代码) "USD" 呢?
USD
。没有地区代码USA
。美国的本地代码包括en_US
(英语)和es_US
(西班牙语)等。如果Uber API正在执行您描述的操作,则是错误的。 - Code Different