了解Swift中货币的NumberFormatter

时间:2017-09-27 12:02:17

标签: ios swift number-formatting

我有一个应用,我正在尝试使用Double格式化NumberFormetter,但我得到的输出与其他应用中的输出不匹配。

以下是我正在使用的代码......

let price:Double = 25
let currencyFormatter = NumberFormatter()
currencyFormatter.usesGroupingSeparator = true
currencyFormatter.numberStyle = .currency
currencyFormatter.locale = NSLocale.current

let priceFormatter = currencyFormatter.string(for: price)

myLabel.text = priceFormatter

使用上面的代码并且在我的应用中将手机的Region设置为中国,我得到25,00 CNY,但在另外两个第三方应用中,输出为CN¥25.00

我做错了什么?

地区设置为中国:

  

我的应用程序
  25,00 CNY

     

其他应用程序
  CN¥25.00

地区设置为法国:

  

我的应用程序
  25,00€

     

其他应用程序
  €25,00

但是当区域设置为United States时,我在所有三(3)个应用中都会得到相同的符号。

地区设置为美国:

  

我的应用程序
  $ 25.00

     

其他应用程序
  $ 25.00

我特别关注区域设置为中国时的输出,因为除了符号不同之外,我还得到一个不同的符号CNY vs CN¥

有任何建议,我做错了吗?

3 个答案:

答案 0 :(得分:5)

Spoiler其他应用程序做错了,输出正确!

答案 1 :(得分:1)

您可以指定the format您想要输出。例子:

Date date = new Date();
Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    cal.set(Calendar.DAY_OF_WEEK, 1);

    return  cal.getTimeInMillis()+ ONE_DAY;

给出输出

  

25.00人民币

您可以更改格式以获取不同的输出:

  

“#0.00¤” => 25.00人民币

     

“#0.00¤¤” => 25.00元

     

“#0.00¤¤¤” => 25.00人民币

答案 2 :(得分:1)

这完全取决于您要做什么。简而言之,当在用户界面中显示结果时,它取决于设备的语言环境,而不是所涉及的货币。

例如,如果我要显示以今天的汇率将一万美元兑换成欧元,那么您可能会在具有德国语言环境的设备上显示8.950,95 €。数字格式和货币代码的位置都将针对相关设备(而不是货币)进行本地化。

但是,如果我在美国设备上显示相同的结果,则可能会以惯用的美国数字/货币格式显示该结果,例如也许€8,950.95

FWIW的英语风格指南,例如《芝加哥风格手册》 《经济学家风格指南》 证实了这种方法。我假设“保留受众对外币的期望”也适用于其他语言。

最重要的是,通常应根据设备的区域设置在用户界面中设置数字的格式,但显然应根据所表示的货币使用货币符号和小数位数。