Как разделить и форматировать число в angularjs

Я хочу сделать числовое число и разделить его на angular.

Например (с учетом количества биткойнов):

         0 => "John has no bitcoins"
         1 => "John has 1 bitcoin"
         2 => "John has 2 bitcoins"
12345.6789 => "John has 12,345.67 bitcoins"

Что я пробовал:

John has
<ng-pluralize count="bitcoin_amount | round:2" 
              when="{'0': 'no bitcoins', 
                     '1': '1 bitcoin', 
                     'other': '{} bitcoins'}">
</ng-pluralize>

Но это терпит неудачу, потому что для чисел, равных или превышающих 1000, они передаются как 1,000 в атрибуте count, поэтому отображаются только тысячи. Например:

1001 => 1
1000 => 1
2000 => 2
etc...

Попробуйте вставить 1,000 в поле number of people эту демонстрацию для примера.


Как я могу отформатировать число И плюрализировать его в angular?

Ответ 1

Здесь нет необходимости использовать регулярное выражение.

Вы можете передать свою логику непосредственно в атрибуте when директивы ng-pluralize следующим образом:

<ng-pluralize count="amount" when="{'0': 'no bitcoins', 
                     '1': '1 bitcoin', 
                     'other': '{{amount | number:2}} bitcoins'}">
</ng-pluralize>

Рабочий плункер.

Ответ 2

Можете ли вы просто удалить запятые и позволить им справиться с этим?

John has
<ng-pluralize count="bitcoin_amount.replace(',','') | round:2" 
              when="{'0': 'no bitcoins', 
                     '1': '1 bitcoin', 
                     'other': '{} bitcoins'}">
</ng-pluralize>

jsfiddle http://jsfiddle.net/9zmVW/

Ответ 3

Если вы хотите использовать общий метод, вы можете по умолчанию добавить 's',

и передать конкретные множественные формы со строкой:

function plural(s, pl){
    var n= parseFloat(s);
    if(isNaN(n) || Math.abs(n)=== 1) return s;
    if(!pl) return s+'s';
    return s.replace(/\S+(\s*)$/, pl+'$1');
}

// test:
[0, .5, 1, 1.5, 2].map(function(itm){
    return [plural(itm+' bitcoin'), 
    plural(itm+' box', 'boxes'), 
    plural(itm+' foot', 'feet')];
}).join('\n');


// returned values:
0 bitcoins, 0 boxes, 0 feet
0.5 bitcoins, 0.5 boxes, 0.5 feet
1 bitcoin, 1 box, 1 foot
1.5 bitcoins, 1.5 boxes, 1.5 feet
2 bitcoins, 2 boxes, 2 feet

Ответ 4

Вы можете использовать l10ns Если вы не хотите использовать ngPluralize, а также хотите сохранить логику в локализации место хранения. l10ns использует ICU Messageformat, который становится стандартом де-факто для обработки плюрализации. ICU Messageformat использует CLDR, который является хранилищем данных и используется многими крупными компаниями, такими как Apple и Google.

В обычном устном английском языке мы имеем две множественные формы singular и plural. CLDR определяет 6 различных видов множественных форм. И они zero, one, two, few, many и other. one и two не обязательно означает число 1 и 2.

Например, в CLDR определены две формы множественного числа для English. one и other. Если вы используете интерфейс перевода в l10ns, вы получите пример каждой формы множественного числа.

Итак, если вы используете L10ns, ваш пример:

{bitcoins, plural, =0{no bitcoins} one{1 bitcoin} other{# bitcoins}}.

В приведенном выше примере =0 нацелен на точный случай.

Для получения дополнительной информации, пожалуйста, просмотрите документацию .