2017-01-12 5 views
2

Я хочу «сокращать» большие числа, чтобы сделать их удобочитаемыми, используя аббревиатуры, которые являются идиоматическими для данного языка. Например, число 16512 станет:Как сокращать большие числа в i18n-friendly?

  • "16.5k" для en-US («к» коротко для метрической приставки «тысяч», как в «километре»)
  • "16,5тыс." для ru (это «ТЫС.» сокращение для «тысяча», что означает «тысяча» на русском языке)

Я не уверен, как назвать эту процедуру, которую я описываю.

Ruby on Rails имеет что-то похожее на то, что я ищу, называется #number_to_human, но это не совсем так - оно вернет "16.5 Thousand" в моем примере выше. Меня интересуют аббревиатуры (и, возможно, не все локали вокруг вещей до ближайшей тысячи), а не просто делают строки удобочитаемыми.

Меня особенно интересовало бы решение, которое работает для JavaScript, но даже название этой процедуры было бы огромной помощью!

+0

Посмотрите на [globalize.js] (https://github.com/globalizejs/globalize). Он использует данные CLDR Unicode и написан на javascript. –

+0

@NiyokoYuliawan Я не верю, что globalize.js помогает здесь; Я вижу методы форматирования числа и валюты, но ни одна из них не выполняет задачу, которую я описываю. На самом деле, я не думаю, что globalize.js делает все, что я не мог сделать с API Intl.NumberFormat. Я также не вижу каких-либо полезных данных в CLDR, если я не пропустил что-то? – ucarion

+0

Ничего, я думаю, ты прав, @NiyokoYuliawan! Название того, что я ищу, - это «короткий» номер. [У CLDR есть данные с коротким номером] (http://cldr.unicode.org/translation/number-patterns#TOC-Short-Numbers). К сожалению, globalize.js еще не реализовал его. Для этого есть проблема: [# 406] (https://github.com/globalizejs/globalize/issues/406). – ucarion

ответ

1

Отвечая на мой собственный вопрос:

Процедура, которую я описываю известен как компактный номер форматирования. Существует два варианта: short ("16.5K") и long ("16.5 Thousand"). Unicode Common Locale Data Repository (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 есть пакет NPM под названием twitter_cldr (документация here и here). Использование выглядит следующим образом:

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億' ] 

Обратите внимание, что в Японии, люди не говорят «12,3 миллиона», они говорят: «1231.2 десять тысяч». Добавьте это в список лжи, которые программисты предполагают о мире!