2016-07-11 5 views
1

Von einer Datenquelle bekomme ich viele Zahlen, die Formatierung vor der Präsentation in einem Browser benötigen.Reg Ex: Entfernen überflüssige Nullen und Dezimalpunkt am Ende einer Zahl

Einige der Zahlen erscheinen mit abschließenden Nullen, und einige der Zahlen erscheinen mit einem nachlaufenden Dezimalpunkt, hinter dem nichts steht.

Hier sind einige Beispiele von dem, was ich habe versucht, mit Javascript regex Implementierung zu erreichen:

130.0000  = 130 
132.0050  = 132.005 
16.9000  = 16.9 
140000000.00 = 140000000 
132.   = 132 
89.0   = 89 
90.0   = 90 
9000.00  = 9000 
99.0   = 99 
99.00500  = 99.005 
70   = 70 //fail, as it matches the zeros at the end if there's no decimal point 
700   = 700 //fail, as it matches the zeros at the end if there's no decimal point 

Die folgende RegEx alles richtig bis auf die letzten beiden Tests übereinstimmt, wo alle Nullen vor dem Komma werden ebenfalls angepasst:

Jede Hilfe mit, was jetzt mir Kopfschmerzen gibt, würde sehr geschätzt werden.

Vielen Dank im Voraus ...

+1

'[\ .0]' bedeutet * entweder eine '.' oder eine' 0' *. Du meintest wahrscheinlich '(\ .0)'. – Pointy

+0

Ich denke, wenn Sie die Regex-Route gehen, müssten Sie zwei separate Regexes verwenden. '\ .0 * $', um nachfolgende Nullen, einschließlich des Dezimalpunkts, und etwas wie '\. \ D *? (0 *) $', um nachfolgende Nullen zu erfassen (diesmal in einer Erfassungsgruppe), aber nur nach einer Dezimalzahl zu folgen Punkt. Die Kombination der beiden scheint ziemlich kompliziert zu sein, und Sie könnten mit einem anderen Ansatz besser dran sein. – SpoonMeiser

+1

@SpoonMeiser: Nicht so kompliziert: '\ .0 * (?! \ D) | (\. \ D *?) 0+ \ b' und durch' $ 1' ersetzen. Aber die angenommene Antwort ist noch besser. –

Antwort

4

Die robuste Funktion, die sie alle Ihre Eingaben und trimmen nehmen ist parseFloat:

const values = [ 
 
    '130.0000', 
 
    '132.0050', 
 
    '16.9000', 
 
    '140000000.00', 
 
    '132.', 
 
    '89.0', 
 
    '90.0', 
 
    '9000.00', 
 
    '99.0', 
 
    '99.00500', 
 
    '70', 
 
    '700' 
 
]; 
 

 
values.map(parseFloat).forEach(it => console.log(it));

Sie können dann jede verwenden der Number Methoden, um eine bestimmte Präzision zu erhalten, rund, neu formatieren, etc.

Während reguläre Ausdrücke many unholy things ausführen können, gibt es manchmal eine Funktion, die einfach funktioniert.

+0

'values.map (Number);' ist ausreichend – Tushar

+0

@Tushar mit dem 'Number' Konstruktor hat in einigen Fällen ein anderes Verhalten als' parseInt' oder 'parseFloat' und es ist im besten Fall unklar, ob es als Callback zu einer Map verwendet wird. – ssube

+0

'values.map (parseFloat)' ist ausreichend. Die Pfeilfunktion ist nicht notwendig. – wpcarro

Verwandte Themen