2013-12-11 11 views
12

pluraliere und formatiere Ich möchte eine Zahl formatieren und es mit eckigen pluralisieren.Wie man eine Zahl in angularjs pluralize

Zum Beispiel (bei einer Anzahl von Bitcoins):

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

Was ich versucht habe:

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

Aber das scheitert kläglich, weil für Zahlen gleich oder größer als 1000, sie sind als 1,000 im count Attribut übergeben, so dass nur Tausende angezeigt werden. ZB:

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

Try 1,000 in der Box number of people von this demo für ein Beispiel einfügen.


Wie kann ich eine Zahl formatieren UND sie in eckigen?

Antwort

23

Sie brauchen hier keinen regulären Ausdruck zu verwenden.

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

Working plunker:

Sie können Ihre Logik direkt im when Attribut der ng-pluralize Direktive wie so passieren.

5

Können Sie nur die Kommas entfernen und lassen Sie es behandeln?

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

Wenn Sie eine allgemeine Methode, die Sie zum Hinzufügen 's' default können,

und gibt spezifische Pluralformen mit der Zeichenfolge:

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

Sie können l10ns verwenden, wenn Sie nicht ngPluralize verwenden möchten und auch wenn Sie Ihre Logik in einem Lokalisierungsspeicher speichern möchten. L10ns verwendet das Nachrichtenformat der ICU, das zum De-facto-Standard für die Handhabung der Pluralisierung wird. ICUs Messageformat verwendet CLDR, das Datenrepository, das von vielen großen Unternehmen wie Apple und Google verwendet wird.

Im normalen gesprochenen Englisch haben wir zwei Pluralformen singular und plural. CLDR definiert 6 verschiedene Arten von Pluralformen. Und sie sind zero, one, two, few, many und other. ist One und two nicht notwendigerweise bedeutet, die Zahl 1 und 2.

Zum Beispiel in CLDR definiert zwei Pluralformen für English. One und other. Wenn Sie die Übersetzungsschnittstelle in l10ns verwenden, erhalten Sie ein Beispiel für jede Pluralform.

Also, wenn Sie L10ns Ihres Beispiel verwenden wäre:

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

Im obigen =0 einen genauen Fall zielt.

Für weitere Informationen bitte überprüfen Sie ihre documentation.