2013-12-11 5 views
12

Я хочу сделать формат и умножить его на угловое.Как плюрализовать и форматировать число в angularjs

Например (учитывая ряд Bitcoins):

  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... 

Try вставив 1,000 в поле number of people из this demo для примера.


Как я могу отформатировать число и умножить его на угловое?

ответ

23

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

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

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

Working plunker.

5

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

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

jsfiddlehttp://jsfiddle.net/9zmVW/

1

Если вы хотите общий метод, который вы можете по умолчанию для добавления '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 
1

Вы можете использовать l10ns Если вы не хотите использовать ngPluralize, а также хотите сохранить свою логику в хранилище локализации. L10ns использует Messageformat ICU, который становится де-факто стандартом для обработки плюрализации. В Messageformat ICU используется 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 ориентирован точный случай.

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

Смежные вопросы