Skip to content

货币

概述

voerkai18n内置支持currency格式化器用来进行多语言场景下的货币显示。

指南

基本用法

当需要对货币本地化显示时,请使用相对应的currency格式化器,可以在t函数中使用来对Number类型进行本地化格式输出。

  • 无参数(默认格式)

    javascript
    t("{ value | currency}",1234.56)    // == ¥1234.56
    await scope.change("en")
    t("{ value | currency}",1234.56)    // == $1,234.56
  • 预定义格式

    内置支持defaultlongshortcustom等预定义格式,不同语言其输出格式是不同的。

    javascript
    t("{ value | currency('long')}",1234.56)    // == 长格式输出: RMB¥1234.56元
    t("{ value | currency('short')}",1234.56)    // ==短格式输出 ¥1234.56
    await scope.change("en")
    t("{ value | currency('long')}",1234.56)    // == $1,234.56
    t("{ value | currency('short')}",1234.56)   // == USD $1,234.56

    预定义格式是在语言格式化文件中配置好的输出模板。 例如:zh语言的long预定义格式是 {prefix} {symbol}{value}{unit}{suffix}

  • 指定货币单位

    javascript
        t("{ value | currency('long',1)}",1234.56)                 // 长格式: 万元
        t("{ value | currency('long',2)}",1234.56)                 // 长格式: 亿
        t("{ value | currency('long',3)}",1234.56)                 // 长格式: 万亿
        t("{ value | currency('long',4)}",1234.56)                 // 长格式: 万万亿
        await scope.change("en")
        t("{ value | currency('short')}",1234.56)                   // 短格式
        t("{ value | currency('short',1)}",1234.56)                 // 短格式 Thousands
        t("{ value | currency('short',2)}",1234.56)                 // 短格式 Millions
        t("{ value | currency('short',3)}",1234.56)                 // 短格式 Billions
        t("{ value | currency('short',4)}",1234.56)                 // 短格式 Trillions
  • 指定位置参数 currency格式化器支持format,unit,precision,prefix,suffix,division,symbol,radix等位置参数,可以根据需要依次传入这些参数来控制货币输出。

    javascript
        // t("{ value | currency(<format>,<unit>,<precision>,<prefix>,<suffix>,<division>,<symbol>,<radix>)}",1234.56)
        t("{ value | currency('long',1)}",1234.56)                 // 长格式: 万元
        t("{ value | currency('long',1,2,'人民币')}",1234.56)                 
        t("{ value | currency('long',1,2,'人民币','元',3,'')}",1234.56)
  • 指定对象参数
    使用位置参数时,只能按顺序输入,如果我们只想为货币输出指定一个后缀,则需要像以下方式来传参:

    javascript
         t("{ value | currency('long',1,2,'人民币','元',3,'<后缀>')}",1234.56)                 
         t("{ value | currency('long',,,,,,'<后缀>')}",1234.56)

    currency格式化器支持通过对象方式进行传参,像这样:

    javascript
         t("{ value | currency({format:'long',suffix:'<后缀>'})}",1234.56)

货币组成

为了支持灵活的货币格式输出,currency格式化器将一个完整的货币字符串划分为五部分:

前缀 符号 单位 后缀
prefix symbol value unit suffix

货币表示可以由prefixsymbolvalueunitsuffix五部份组成。然后,可以配置一个format模板字符串,该模板字符串可以由五个占位符({prefix}{symbol}{value}{unit}{suffix})自由组合来输出货币。

并且不同语言或不同的应用场景,可以通过配置format模板字符串,自由组合货币输出格式。

例:

  • format = "{symbol} {value}{unit}" ==> ¥123.45元
  • format = "{prefix} {symbol} {value}{unit}" ==> 人民币:¥123.45元

参数

currency格式化器支持参数:

参数 类型 默认值 说明
format String default 取值long,short,default,<模板字符串>
unit Number 0 进制位,如亿,万亿,万万亿
precision Number 2 即小数精度
prefix String '' 前缀
suffix String '' 后缀,不同语言默认值不同
division Number 逗号分割位,如3代表每3位加一个逗号
symbol String '' 货币符号,不同语言默认值不同,中文默认是¥,英文$
radix Number `` unit进制,不同语言默认值不同,中文默认是4,英文3

以上大部份参数都很好理解,重点需要关注的有:

  • radix: 英文中,每3个数字加一个逗号,对应thousands,millions,billions,trillions,....。 而我们中国更加习惯每4个数字进一个位,表达时会习惯使用元、万、亿来表示。 如用英文表示123,456,789.00,我们要看半天才知道是多少。而如果用四位分割1,2345,6789.00,则我们很容易就看出是1亿...。 而radix参数就是用来配置多个位一个单位的。中文时默认是4,英文时默认是3。

  • division 该参数用来指示每division个数字加一个逗号,该参数与radix的区别在哪里? 虽然,货币如果采用四位一逗号方式更加符合我们中国人的阅读习惯,但是现实由也很经常使用三位一逗号的表达方式。 也就是说,可以通过只需要使用division参数就可以配置为三位一逗号或四位一逗号。 如果说中文三位一逗号或四位一逗号均可以接受,但是在不是以元为单位,而是以万元、亿来表示货币单位时,中文与英文差异就非常明显了,我们一般会说多少万,多少亿,而不会以英文三位一进的方式,说多少千。 radixdivision的差别就在于此,division仅仅是用来指示多少位加一个逗号,而radix用来指示当要使用货币的进制单位时,以多少做一个进制。英文radix=3,就对应thousands,millions,billions,trillions 而中文radix=4,就对应亿万亿、... 也说是说,radix参数仅当指定unit>0时用来计算出合适的单位使用的。

示例

activeLanguage='zh'时,radix=4,units = ["","万","亿","万亿","万万亿"]

value radix division unit 输出
123456789.88 4 4 0 1,2345,6789.00
123456789.88 4 4 1 1,2345.6789万
123456789.88 4 4 2 1.23456789亿
123456789.88 4 4 3 0.000123456789万亿
division=3
123456789.88 4 3 0 123,456,789.00
123456789.88 4 3 1 12,345.6789万
123456789.88 4 3 2 1.23456789亿
123456789.88 4 3 3 0.000123456789万亿

activeLanguage == "zh"时:

javascript
    t("{ value | currency}",123456789.88)                           // ¥1,2345,6789.88
    // long
    t("{ value | currency('long')}",123456789.88)                   // RMB ¥1,2345,6789.88元
    t("{ value | currency('long',1)}",123456789.88)                 // RMB ¥1,2345.678988万元
    t("{ value | currency('long',2)}",123456789.88)                 // RMB ¥1.2345678988亿元
    t("{ value | currency('long',3)}",123456789.88)                 // RMB ¥0.00012345678988万亿元
    t("{ value | currency('long',4)}",123456789.88)                 // RMB ¥0.000000012345678988万万亿元
    // short
    t("{ value | currency('short')}",123456789.88)                   // ¥1,2345,6789.88
    t("{ value | currency('short',1)}",123456789.88)                 // ¥1,2345.678988万
    t("{ value | currency('short',2)}",123456789.88)                 // ¥1.2345678988亿
    t("{ value | currency('short',3)}",123456789.88)                 // ¥0.00012345678988万亿
    t("{ value | currency('short',4)}",123456789.88)                 // ¥0.000000012345678988万万亿
    // 自定义货币格式
    t("{ value | currency({symbol:'¥¥'})}",123456789.88)     // = RMB ¥¥1,2345,6789.88元
    t("{ value | currency({symbol:'¥¥',prefix:'人民币:'})}",123456789.88)  // = 人民币: ¥¥1,2345,6789.88元
    t("{ value | currency({symbol:'¥¥',prefix:'人民币:',suffix:'元整'})}",123456789.88)    // = 人民币: ¥¥1,2345,6789.88元整
    t("{ value | currency({symbol:'¥¥',prefix:'人民币:',suffix:'元整',unit:2})}",123456789.88)// = ¥¥1.2345678988亿元整
    t("{ value | currency({symbol:'¥¥',prefix:'人民币:',suffix:'元整',unit:2,precision:4})}",123456789.88)// = ¥¥1.2346+亿元整
    t("商品价格: { value | currency({symbol:'¥¥',prefix:'人民币:',suffix:'元整',unit:2,precision:4,format:'{prefix}*{symbol}*{value}*{unit}*{suffix}'})}",123456789.88)  // = 人民币:*¥¥*1.2346+*亿*元整

activeLanguage == "en"时:

javascript
    t("{ value | currency}",123456789.88)                           // $123,456,789.88
    // long
    t("{ value | currency('long')}",123456789.88)                   // USD $123,456,789.88
    t("{ value | currency('long',1)}",123456789.88)                 // USD $123,456.78988 thousands
    t("{ value | currency('long',2)}",123456789.88)                 // USD $123.45678988 millions
    t("{ value | currency('long',3)}",123456789.88)                 // USD $0.12345678988 billions
    t("{ value | currency('long',4)}",123456789.88)                 // USD $0.00012345678988 trillions
    // short
    t("{ value | currency('short')}",123456789.88)                   // $123,456,789.88
    t("{ value | currency('short',1)}",123456789.88)                 // $123,456.78988 thousands
    t("{ value | currency('short',2)}",123456789.88)                 // $123.45678988 millions
    t("{ value | currency('short',3)}",123456789.88)                 // $0.12345678988 billions
    t("{ value | currency('short',4)}",123456789.88)                 // $0.00012345678988 trillions

配置

  • 配置文件languages/formatters/<语言名称>.js
  • 配置位置$config.currency
  • 配置参数
    javascript
    export default {
        $config:{ 
            currency          : {
                default       : "{symbol}{value}{unit}",   // 默认模板
                long          : "{prefix} {symbol}{value}{unit}{suffix}",  // 长格式模板
                short         : "{symbol}{value}{unit}",                  // 长格式模板
                custom        : "{prefix} {symbol}{value}{unit}{suffix}", // 定制模板,当使用currency({...})时生效
                format        : "default",             // 默认格式,可以取值是long/short/default/custom
                //--
                units         : [""," thousands"," millions"," billions"," trillions"],    //千,百万,十亿,万亿
                radix         : 3,                       // 进制,即三位一进,中文是4位一进
                symbol        : "$",                     // 符号
                prefix        : "USD",                   // 前缀
                suffix        : "",                      // 后缀
                division      : 3,                       // ,分割位
                precision     : 2,                       // 精度                 
            }
        }
    }

也可以自行配置定义一个预设的格式,如下:

javascript
export default {
    $config:{ 
        currency          : {
            bitcoin       : "BTC {symbol}{value}{unit}{suffix}"
        }
    }
}
// 然后在翻译时就可以:

t("我有{value | currency('bitcoin') }个比特币",12344354)
t("我有{value | currency({format:'bitcoin',symbol:'฿') }个比特币",12344354)

扩展配置

voerkai18n运行时已经内置了zhen两种语言的货币输出的格式化器,主要是currency格式式化器,该格式化器被设计为可以进行配置。当以上格式化器不能满足要求,或者缺少某种语言的货币格式化时,可以非常容易地进行扩展。

扩展支持不同语言言的日期时间格式化非常简单,当使用voerkai18n compile后,项目结构中会生成formatters如下:

javascript
<myapp>
   |--src
   |  |-- languages
   |  |   |--
   |  |   |-- formatters
   |  |   |   |-- zh.js
   |  |   |   |-- en.js
   |  |   |   |-- de.js
    
   ....

formatters文件夹中的zh.jsen.jsde.js文件中包括了您自定义的格式化器。

当您第一次打开这些文件时,会发现里面除了一些注释来引导您如何编写扩展格式化器外,并没有其他有效的内容。

如果您对现有的日货币格式化器的输出不满意,或者缺少某种语言的货币格式化,您可以按下面介绍的方式来进行扩展。

放心,整个扩展过程非常简单,大部分情况下,只需要配置一些模板字符串即可。

以下开始介绍内容:

  • 通过简单的配置修改内置的货币格式化规则
  • 为运行时没有支持的语言增加货币格式化规则
  • 自定义预设的规则
  • 编写货币格式化模板

修改内置规则

由于@voerkai18n/runtime中已经内置了zhen两种语言的货币格式化器,大多数情况下,我们会定时更新确保其有效工作,一般情况下,您是不需要修改zh.jsen.js这两个文件了。

但是如果内置的zhen两种语言的货币格式化器不能满足要求,您可以选择性地修改zh.jsen.js这两个文件,这些文件会覆盖合并到内置的日期和时间格式化规则。

当您第一次打开languages/formatters/<语言名称>.js时会发现里面是空的(除了一些注释外)。内容大概如下:

javascript
export default {
    $config:{

    }
}

接下来,我们只需要在languages/formatters/<语言名称>.js文件中按需调整货币格式化的配置参数即可。比如:

  • 我们想让zh语言的默认格式采用long格式,则需要修改:
javascript
export default {
    $config:{
        datetime:{
            currency:{
                format        : "long",
            }
        }
    }
}
  • 将修改德国的货币符号为
javascript
export default {
    $config:{
        datetime:{
            currency:{
                symbol  : "€",
            }
        }
    }
}
  • 修改中文long预设格式

中文long预设格式是{prefix} {symbol}{value}{unit}{suffix},修改为RMB {symbol}{value}元.则需要修改languages/formatters/zh.js,如下:

javascript
export default {
    $config:{
        datetime:{
            currency:{
                long  : "RMB {symbol}{value}元",
            }
        }
    }
}

那么t("{value | currency('long')}",123.88)将输出RMB 123.88元

完整的配置项见下文。

增加格式化规则

目前,voerkai18n只内置了zh,en两种语言的货币规则支持。其中,en语言的货币格式化器被注册到全局。当切换到zh,en两种语言之外的其他语言时,会使用en语言的货币格式化规则。

很明显,en语言的日期时间格式化规则并不能适应所有语言的要求,在官方提供该语言支持前,您可以自行配置语言支持。

方法很简单,以de语言为例,打开languages/formatters/de.js文件。

javascript
export default {
    $config:{
        datetime:{
            date:{                
                long:"<de语言的长格式货币模板>"
                short:"<de语言的短格式货币模板>"
                format:"long"         // 默认使用long格式,也可以使用一个模板字符串
            }
        }
    }
}

这样,当切换到de语言时,date格式化器就会读取languages/formatters/de.js文件中的配置,从而实现符合要求的de语言的货币格式化。

扩展预设规则

除了预设的longshortdefaultcustom等规则外,您可以通过模板字符串来自定义更加灵活的格式化规则。 您也可以自己定义一个预设格式化规则。

比如可以定义一个rmb的规则来显示更加完整的人民币,方法如下: 在languages/formatters/zh.json中,增加一个rmb配置项即可。

javascript
export default {
    $config: {
        rmb: "人民币: {symbol}{value}元整"
    }
}

有了自定义的rmb预设规则,应用中就可以直接使用t("现在是{ value | currency('rmb') }") 进行格式化,而不需要使用自定义模板字符串的形式。