Flutter 货币自动转换

459 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

前言

不管是web还是app,做国际化涉及到商品都有个货币转换的问题。

en$100.01,而eu,则是100,01€。不仅仅是符号,还有符号的位置小数点,和分隔符都是不一样的。

手动转换不现实,不同的Locale就可能有不同的格式,那Flutter如何做货币格式的自动转换呢?

Intl NumberFormat

如JS中有Intl.NumberFormat,那么在Flutter是否有呢?

image.png

如上,虽然只介绍了数字格式转换,实际上也支持携带货币

NumberFormat.simpleCurrency 和 NumberFormat.currency

这两个是支持带货币的数字格式转换,simpleCurrency可以根据localename,自动进行转换,如果指定name(ISO 4217表),name的优先级会大于locale,会按name来找到对应的货币符号。

// 100,01€
String res = NumberFormat.simpleCurrency(locale: 'eu').format(100.01);

format的值应该是en标准的,即100.01,num格式。返回的结果则是String

currencysimpleCurrency的不同则是,NumberFormat.currency可以指定货币符号,以及格式

假如并不想要自动分配的货币符号,可以指定symbol

// US$100.01
NumberFormat.currency(
    symbol: 'US$',
    locale: 'en').format(100.01);

若是需要特定的格式,比如说符号和数字之间我想加个空格,那就需要使用自定的格式。 不过也意味着,你需要为你支持的语言,都预设好格式。

货币价格的格式基本可以参考这几个规则

  1. 符号0 表示一个数字
  2. 符号# 表示一个数字,但是不存在时为0。为0时,若是小数点前,并且他的左边没有不为0(除非1中的符号0)的数字,则他不显示,小数点后,他的右边没有不为0(除非1中的符号0)的数字,则不显示。其他情况不存在或为0时显示为0
  3. 符号. 小数点分隔符
  4. 符号, 分组分隔符,比如千分位的, 1,000.00
  5. 符号- 减号
  6. 符号\u00a4 货币记号,会被实际货币符号替换

其他的如空格,直接加不会做额外的处理,如

// 2.010,1 €
NumberFormat.currency(
    customPattern: '#,###,##0.# \u00a4',
    symbol: '€',
    locale: 'eu').format(02010.10);

就可以规定需要的格式了。

保留小数点后几位

NumberFormat.simpleCurrencyNumberFormat.currency均可以指定decimalDigits来保留小数点后几位,这个是四舍五入的。

// 2.010,12 €
NumberFormat.currency(
    customPattern: '#,###,##0.# \u00a4',
    symbol: '€',
    decimalDigits: 2,
    locale: 'eu').format(02010.115);

有时候不需要四舍五入,那也可以不用decimalDigits,通过对字符串的直接裁剪(不够则补充'0'),也可以实现不四舍五入的保留小数点后几位。