internationalization - 如何以 i18n 友好的方式缩写大数?

标签 internationalization

我想使用给定语言环境惯用的缩写来“缩写”大量数字,使它们易于人类阅读。例如,号码 16512会成为:

  • "16.5k"en-US (“k”是公制前缀“千”的缩写,如“公里”)
  • "16,5тыс."ru (“тыс.”是“тысяча”的缩写,在俄语中意为“千”)

  • 我不确定我正在描述的这个程序叫什么。

    Ruby on Rails 有一些类似于我正在寻找的东西,叫做 #number_to_human ,但这不太正确——它会返回 "16.5 Thousand"在我上面的例子中。我对缩写感兴趣(也许并非所有语言环境都将事物四舍五入到最接近的千位),而不仅仅是使字符串易于阅读。

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

    最佳答案

    回答我自己的问题:

    我所描述的过程称为紧凑数字格式。有两种变体:短( "16.5K" )和长( "16.5 Thousand" )。 Unicode 通用语言环境数据存储库 (CLDR) 为每个语言环境中的紧凑数字提供数字格式模式:http://cldr.unicode.org/translation/number-patterns#TOC-Short-Numbers

    对于 JavaScript,有一个(停滞的)ECMA 建议添加一个 compact 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 万”。将其添加到程序员对世界假设的谎言列表中!

    关于internationalization - 如何以 i18n 友好的方式缩写大数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41604976/

    相关文章:

    ruby-on-rails - ruby on rails i18n 和 number_to_currency 负值

    iphone - 无法在 iOS 上使用非 QWERTY 键盘打字

    date - 日历系统名称的国际标准

    internationalization - 在 i18n 中命名消息属性的正确方法是什么?

    ios - 应用程序本地化后如何在 NSString 中查找单词?

    ruby - Ruby 中 Windows 上的 Unicode 文件名

    javascript - 自动加载命名空间 i18next

    c++ - 如何在运行时给出 "hello world"?

    java - 在 Form .java 文件中检索用于国际化的 Spring 外部化字符串

    internationalization - 如何在 Swagger 模型中定义具有任意键的 Map