持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
前言
不管是web还是app,做国际化涉及到商品都有个货币转换的问题。
如en,$100.01
,而eu,则是100,01€
。不仅仅是符号,还有符号的位置,小数点,和分隔符都是不一样的。
手动转换不现实,不同的Locale
就可能有不同的格式,那Flutter如何做货币格式的自动转换呢?
Intl NumberFormat
如JS中有Intl.NumberFormat
,那么在Flutter是否有呢?
如上,虽然只介绍了数字格式转换,实际上也支持携带货币。
NumberFormat.simpleCurrency 和 NumberFormat.currency
这两个是支持带货币的数字格式转换,simpleCurrency
可以根据locale
和name
,自动进行转换,如果指定name(ISO 4217表),name的优先级会大于locale,会按name来找到对应的货币符号。
// 100,01€
String res = NumberFormat.simpleCurrency(locale: 'eu').format(100.01);
format的值应该是en标准的,即100.01,num格式。返回的结果则是String。
currency
与simpleCurrency
的不同则是,NumberFormat.currency
可以指定货币符号,以及格式。
假如并不想要自动分配的货币符号,可以指定symbol
。
// US$100.01
NumberFormat.currency(
symbol: 'US$',
locale: 'en').format(100.01);
若是需要特定的格式,比如说符号和数字之间我想加个空格,那就需要使用自定的格式。 不过也意味着,你需要为你支持的语言,都预设好格式。
货币价格的格式基本可以参考这几个规则
- 符号0 表示一个数字
- 符号# 表示一个数字,但是不存在时为0。为0时,若是小数点前,并且他的左边没有不为0(除非1中的符号0)的数字,则他不显示,小数点后,他的右边没有不为0(除非1中的符号0)的数字,则不显示。其他情况不存在或为0时显示为0
- 符号. 小数点分隔符
- 符号, 分组分隔符,比如千分位的, 1,000.00
- 符号- 减号
- 符号\u00a4 货币记号,会被实际货币符号替换
其他的如空格,直接加不会做额外的处理,如
// 2.010,1 €
NumberFormat.currency(
customPattern: '#,###,##0.# \u00a4',
symbol: '€',
locale: 'eu').format(02010.10);
就可以规定需要的格式了。
保留小数点后几位
NumberFormat.simpleCurrency
和 NumberFormat.currency
均可以指定decimalDigits
来保留小数点后几位,这个是四舍五入的。
// 2.010,12 €
NumberFormat.currency(
customPattern: '#,###,##0.# \u00a4',
symbol: '€',
decimalDigits: 2,
locale: 'eu').format(02010.115);
有时候不需要四舍五入,那也可以不用decimalDigits
,通过对字符串的直接裁剪(不够则补充'0'),也可以实现不四舍五入的保留小数点后几位。