2011-01-30 18 views
5

Mam następujący kod:JavaScript Regex: zastępując ostatnią kropkę na przecinek

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

To działa niesamowicie, jak chcę go do pracy. Chcę tylko mały dodatek, który jest coś takiego:

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

Jednak ten kod zastąpi pierwsze wystąpienie „”, gdzie chcę, aby złapać ostatni. Każda pomoc będzie doceniona.

Odpowiedz

15

można to zrobić za pomocą wyrażenia regularnego:

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

To wyrażenie regularne dopasowuje przecinek a następnie dowolna ilość tekstu bez przecinka. Łańcuch zastępczy to tylko kropka, po której następuje to, co przyszedł po oryginalnym ostatnim przecinku. Nie ma to wpływu na inne przecinki poprzedzające je w łańcuchu.

Teraz, jeśli jesteś naprawdę konwersji liczb sformatowanych w „europejskim stylu” (z braku lepszego określenia), będziesz także muszą się martwić o „” znaków w miejscach, w których numer "w stylu USA" miałby przecinki. Myślę, że pewnie chcą się ich pozbyć:

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

Podczas korzystania z „.replace()” funkcja na sznurku, należy zrozumieć, że powraca zmodyfikowany ciąg. To nie zmienia ciąg oryginalny jednak, tak jak stwierdzenie:

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

nie ma wpływu na wartość „x”.

+0

Pamiętaj, aby pozbyć się znaków końca okresu PRZED przekonwertowaniem przecinka na jeden lub otrzymasz radykalnie inny numer! Musi istnieć wyrażenie regularne, które konwertuje okresy tylko wtedy, gdy poprzedzone są przecinkiem i konwertuje przecinek tylko wtedy, gdy poprzedzone są kropkami ... Pomyśl, że właśnie znalazłem to, co robię z moją godziną lunchu ... – RyanfaeScotland

2

Możesz to zrobić za pomocą funkcji lastIndexOf(), aby znaleźć ostatnie wystąpienie , i zastąpić je.

Alternatywą jest użycie wyrażenia regularnego z końcem znacznika linia:

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

Czy to działa? Pierwszy "," również będzie miał koniec linii. – GolezTrol

0

Nie trzeba się martwić o to, czy nie jest to ostatni „”, ponieważ jest tylko jeden. JavaScript nie zapisuje numerów wewnętrznie przy użyciu przecinków lub zestawów rozdzielanych kropkami.

+0

Reguła numer jeden to nigdy nie ufaj wejściom.Więc się martwię :) Nigdy mniej dziękuję za odpowiedź. – Shyam

+0

Wejście nie ma znaczenia - uruchamiasz 'replace' na wyjściu' String (parseFloat (n) .toFixed (2)) ', które zawsze zwróci ciąg znaków reprezentujący' nil' lub liczbę z pojedynczy przecinek dziesiętny i zero przecinków. JavaScript NIGDY nie konwertuje liczby na ciąg znaków z ogranicznikami przecinka, chyba że napiszesz metodę, aby to zrobić specjalnie. – coreyward

1

Można użyć lastIndexOf znaleźć ostatnie wystąpienie ,. Następnie możesz użyć slice, aby wstawić część przed i po , wraz z . pomiędzy nimi.

+0

Czy regex nie byłby lepszy, ponieważ jest to wzór dopasowania, którego szukam? – Shyam

1

Możesz użyć wyraŜenia regularnego. Chcesz zastąpić ostatni "," więc podstawową ideą jest zamiana "," po której nie ma "," po.

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

Zwróci to, co chcesz :-).

Powiązane problemy