2013-12-11 41 views
12

我想要格式化一个数字并用角度对它进行复数化。如何在angularjs中复数化和格式化一个数字

例如(给定数量的比特币的):

  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更大,他们是在count属性中作为1,000传递,因此只显示了数千个。 如:

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

尝试的this demonumber of people为例粘贴1,000


如何格式化数字并将其复数化为角?

回答

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使用ICU的消息格式,它正在成为处理复数的事实上的标准。 ICU的消息格式使用CLDR,它是许多主要公司如Apple和Google使用的数据存储库。

在正常的英语口语中,我们有两种复数形式:singularplural。 CLDR定义了6种不同类型的复数形式。它们是zeroone,two,few,manyotherOnetwo不一定表示数字1和2.

例如在CLDR中为English定义了两个复数形式。 Oneother。如果您碰巧使用l10ns中的翻译界面,那么您将得到每个复数形式的示例。

所以,如果你正在使用L10ns您的例子是:

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

在上面,=0的目标是一个确切的情况。

欲了解更多信息,请结帐其documentation