Swift货币格式ISO标准转换问题

时间:2015-07-26 22:22:12

标签: ios swift currency

阅读完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”

2 个答案:

答案 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返回的确切内容以及您想要使用它做什么,这可能会有所帮助。