国际化 – 如何以i18n友好的方式缩写大数字?

我希望使用对于给定语言环境惯用的缩写来“缩写”大数字以使它们具有人类可读性.例如,数字16512将变为:

>“16.5k”表示en-US(“k”表示公制前缀“千”,如“公里”)
>“16,5тыс.” for ru(“тыс.”是“тысяча”的缩写,意思是“千”俄文)

我不知道该怎么称呼这个我正在描述的程序.

Ruby on Rails有类似于我正在寻找的东西,叫做#number_to_human,但它不太正确 – 它会在我上面的例子中返回“16.5千”.我对缩写感兴趣(并且可能并非所有语言环境都将事物舍入到最接近的千位),而不仅仅是将字符串设置为人类可读的.

我对一个适用于JavaScript的解决方案特别感兴趣,但即使这个程序的名称也会有很大的帮助!

最佳答案 回答我自己的问题:

我所描述的过程称为紧凑数字格式.有两种变体:短(“16.5K”)和长(“16.5千”). Unicode公共区域设置数据存储库(CLDR)为每个区域设置中的紧凑型数字提供数字格式设置模式:http://cldr.unicode.org/translation/number-patterns#TOC-Short-Numbers

对于JavaScript,有一个(停滞的)ECMA提议,要向Intl.NumberFormat API添加一个压缩选项:https://github.com/tc39/ecma402/issues/37

幸运的是,对于Ruby和JS程序员,Twitter有一个名为twitter_cldr的NPM包(文档是herehere).用法如下:

const TwitterCldr = require('twitter_cldr');

function printNumbers(localeName) {
    const locale = TwitterCldr.load(localeName);
    const formatter = new locale.ShortDecimalFormatter();

    const numbers = [123, 1231, 12312, 123123, 1231231, 12312312, 123123123];
    return numbers.map(n => formatter.format(n, { precision: 1 }));
}

console.log(printNumbers('en'));
// [ '123.0', '1.2K', '12.3K', '123.1K', '1.2M', '12.3M', '123.1M' ]
console.log(printNumbers('ru'));
// [ '123,0', '1,2 тыс.', '12,3 тыс.', '123,1 тыс.', '1,2 млн', '12,3 млн', 123,1 млн' ]
console.log(printNumbers('ja'));
// [ '123.0', '1.2千', '1.2万', '12.3万', '123.1万', '1231.2万', '1.2億' ]

请注意,在日本,人们不会说“1230万”,他们会说“1231.2万”.将其添加到虚假程序列表程序员假设世界!

点赞