2011-01-30 6 views
5

Ho il seguente codice:Javascript Regex: sostituendo l'ultimo punto per una virgola

var x = "100.007" 
x = String(parseFloat(x).toFixed(2)); 
return x 
=> 100.01 

Questo funziona incredibilmente proprio come voglio farlo funzionare. Voglio solo una piccola aggiunta, che è qualcosa di simile:

var x = "100,007" 
x.replace(",", ".") 
x.replace 
x = String(parseFloat(x).toFixed(2)); 
x.replace(".", ",") 
return x 
=> 100,01 

Tuttavia, questo codice sostituirà la prima occorrenza del "", dove voglio prendere l'ultimo. Qualsiasi aiuto sarebbe apprezzato.

risposta

15

si può fare con un'espressione regolare:

x = x.replace(/,([^,]*)$/, ".$1"); 

Quella espressione regolare corrisponde a una virgola seguita da qualsiasi quantità di testo che non includa una virgola. La stringa sostitutiva è solo un periodo seguito da qualunque cosa venisse dopo l'ultima virgola originale. Altre virgole che lo precedono nella stringa non saranno interessate.

Ora, se si convertono veramente i numeri formattati in "stile europeo" (per mancanza di un termine migliore), sarà anche necessario preoccuparsi del "." caratteri in luoghi in cui un numero "stile USA" avrebbe virgole. Penso che probabilmente si vuole solo sbarazzarsi di loro:

x = x.replace(/\./g, ''); 

Quando si utilizza il ".Rimontare) (" la funzione su una stringa, si dovrebbe capire che si rendimenti la stringa modificata. Non modifica la stringa originale , tuttavia, in modo una dichiarazione come:

x.replace(/something/, "something else"); 

non ha alcun effetto sul valore di "x".

+0

Assicurati di liberarti dei caratteri del periodo PRIMA di convertire la virgola in uno o finirai con un numero radicalmente diverso! Ci deve essere una regex là fuori che converte i periodi solo se sono seguiti da una virgola e converte la virgola solo se è preceduta da punti ... Pensa che ho appena trovato quello che sto facendo con la mia ora di pranzo ... – RyanfaeScotland

2

È possibile farlo utilizzando la funzione lastIndexOf() per trovare l'ultima occorrenza di , e sostituirla.

L'alternativa è quella di usare un'espressione regolare con la fine della linea marcatore:

myOldString.replace(/,([^,]*)$/, ".$1"); 
+0

Funziona? Anche il primo ',' avrà un fine riga da qualche parte. – GolezTrol

0

Non devi preoccuparti se è o meno l'ultimo ".", Perché ce n'è solo uno. JavaScript non memorizza i numeri internamente con virgole o set delimitati da punti.

+0

La regola numero uno è di non fidarsi mai dell'input.Quindi mi preoccupo :) Meno male grazie per la tua risposta. – Shyam

+0

L'input non ha importanza - stai eseguendo 'replace' sull'output di' String (parseFloat (n) .toFixed (2)) ', che restituirà sempre una rappresentazione in stringa di' nil' o un numero con un singolo decimale e zero virgole. JavaScript non convertirà MAI un numero in una stringa con delimitatori di virgola a meno che non si scriva un metodo per farlo in modo specifico. – coreyward

1

È possibile utilizzare lastIndexOf per trovare l'ultima occorrenza di ,. Quindi è possibile utilizzare slice per inserire la parte prima e dopo lo , insieme a uno . interno.

+0

Non sarebbe una regex essere meglio, in quanto è una corrispondenza di modello che sto cercando? – Shyam

1

È possibile utilizzare un'espressione regolare. Vuoi sostituire l'ultimo ',', quindi l'idea di base è sostituire il ',' per il quale non c'è ',' dopo.

x.replace(/,([^,]*)$/, ".$1"); 

Restituirà quello che vuoi :-).

Problemi correlati