2013-12-11 5 views
12

数値を書式化して角をつけて複数形にしたい。例えばanglejsで数値を複数形にしてフォーマットする方法

(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年より等しいか、大きな数字のために、彼らはあるので、 count属性には1,000が渡されているため、何千ものしか表示されません。 例:

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

は、例えばthis demoのボックスnumber of people1,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

l10nsngPluralizeを使用したくない場合や、ロジックをローカリゼーションストレージに保存する場合は、使用することができます。 L10nsはICUのMessageformatを使用しています。これは複数化を扱う事実上の標準になっています。 ICUのMessageformatは、CLDRを使用しています。CLDRは、AppleやGoogleなどの多くの主要企業が使用し、貢献しているデータリポジトリです。

通常の音声英語では、2つの複数の形式singularpluralがあります。 CLDRは6種類の複数形を定義しています。そして、それらはzero,one,two,few,manyおよびotherである。 Oneおよびtwoは、必ずしも番号1および2を意味するものではない。

例えば、CLDRでは、Englishの2つの複数の形式が定義されています。 Oneおよびother。翻訳インタフェースをl10nsで使用すると、それぞれ複数のフォームの例が表示されます。あなたがL10nsを使用している場合

は、だからあなたの例では、次のようになります。上記で

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

=0は正確なケースを目標としています。

詳細については、documentationをご確認ください。

関連する問題