Mam 2,299.00
jako ciąg i próbuję przeanalizować go na liczbę. Próbowałem użyć parseFloat
, co daje 2. Myślę, że problem stanowi przecinek, ale jak mam rozwiązać ten problem we właściwy sposób? Po prostu usunąć przecinek?
var x = parseFloat("2,299.00")
alert(x);
javascript
number-formatting
user1540714
źródło
źródło
.replace(/,/g, '')
To wyrażenie regularne używa globalnegog
do zastąpienia wszystkiego.parseFloat("2,000,000.00".replace(',',''))
Zwraca2000
i 2. zawodzi w wielu regionach świata, w których,
występuje miejsce po przecinku, np.parseFloat("2.000.000,00".replace(',',''))
Zwraca2
- zobacz moją odpowiedź poniżej na coś, co działa na całym świecie.Usuwanie przecinków jest potencjalnie niebezpieczne, ponieważ, jak wspominali inni w komentarzach, w wielu lokalizacjach przecinek oznacza coś innego (np. Miejsce dziesiętne).
Nie wiem, skąd masz swój ciąg, ale w niektórych miejscach na świecie
"2,299.00"
=2.299
Intl
Przedmiot mógł być dobry sposób, aby rozwiązać ten problem, ale jakoś udało im się wysyłać spec tylko zIntl.NumberFormat.format()
API i bezparse
odpowiednika :(Jedynym sposobem na przeanalizowanie ciągu znaków z kulturowymi znakami numerycznymi do postaci rozpoznawalnej przez maszynę liczby w jakikolwiek rozsądny sposób i18n jest użycie biblioteki, która wykorzystuje dane CLDR do pokrycia wszystkich możliwych sposobów formatowania ciągów liczbowych http: //cldr.unicode. org /
Dwie najlepsze opcje JS, z jakimi się do tej pory spotkałem:
źródło
W nowoczesnych przeglądarkach możesz użyć wbudowanego Intl.NumberFormat, aby wykryć formatowanie liczb w przeglądarce i znormalizować dane wejściowe, aby pasowały.
Jest oczywiście miejsce na optymalizację i buforowanie, ale działa to niezawodnie we wszystkich językach.
źródło
Usuń wszystko, co nie jest cyfrą, kropką dziesiętną ani znakiem minus (
-
):Zaktualizowane skrzypce
Zauważ, że nie będzie działać dla liczb w notacji naukowej. Jeśli chcesz go zmienić
replace
linię dodaće
,E
i+
do listy dopuszczalnych znaków:źródło
str = str.replace(/(\d+),(?=\d{3}(\D|$))/g, "$1");
To jest to, czego bym użył, ale jestem całkowicie bezużyteczny w regex i jest to coś, co znalazłem jakiś czas temu w innym wątku SO.parseFloat
- co to zweryfikuje. :-)Zwykle należy rozważyć użycie pól wejściowych, które nie pozwalają na dowolne wprowadzanie tekstu dla wartości liczbowych. Ale mogą być przypadki, kiedy trzeba odgadnąć format wejściowy. Na przykład 1,234,56 w Niemczech oznacza 1234,56 w USA. Wejdź na https://salesforce.stackexchange.com/a/21404, aby zapoznać się z listą krajów, w których przecinek jest dziesiętny.
Używam następującej funkcji, aby zgadnąć i usunąć wszystkie znaki nienumeryczne:
Wypróbuj tutaj: https://plnkr.co/edit/9p5Y6H?p=preview
Przykłady:
Funkcja ma jeden słaby punkt: nie można odgadnąć formatu, jeśli masz 1,123 lub 1,123 - ponieważ w zależności od formatu ustawień regionalnych oba mogą być przecinkiem lub separatorem tysięcy. W tym szczególnym przypadku funkcja potraktuje separator jako separator tysięcy i zwróci 1123.
źródło
3,00 €
również jest zamienione na 3,00. Tylko uwaga, która3,001
jest sformatowana na3001
. Aby tego uniknąć, dane wejściowe powinny zawsze zawierać symbole dziesiętne. Np.3,001.00€
3,001.00
Konwertuje poprawnie. Zaktualizuj jsfiddle.0,124
nadal jest konwertowany na 124Zaskakujące jest to, że uwzględnili toLocaleString, ale nie metodę analizy . Przynajmniej toLocaleString bez argumentów jest dobrze obsługiwana w IE6 +.
W przypadku rozwiązania i18n wymyśliłem to:
Najpierw wykryj lokalny separator dziesiętny użytkownika:
Następnie znormalizuj liczbę, jeśli w ciągu znaków jest więcej niż jeden separator dziesiętny:
Na koniec usuń wszystko, co nie jest liczbą ani separatorem dziesiętnym:
źródło
Jest to uproszczone, dyskretne opakowanie wokół
parseFloat
funkcji.źródło
Jeśli chcesz uniknąć problemu, który opublikował David Meister i masz pewność co do liczby miejsc po przecinku, możesz zamienić wszystkie kropki i przecinki i podzielić przez 100, np .:
lub jeśli masz 3 miejsca po przecinku
To zależy od Ciebie, czy chcesz używać parseInt, parseFloat czy Number. Jeśli chcesz zachować liczbę miejsc dziesiętnych, możesz użyć funkcji .toFixed (...).
źródło
Wszystkie te odpowiedzi zawodzą, jeśli masz liczbę w milionach.
3,456,789 zwróciłoby po prostu 3456 przy użyciu metody replace.
Najbardziej poprawną odpowiedzią na proste usunięcie przecinków powinno być.
Lub po prostu napisane.
źródło
To konwertuje liczbę w dowolnym miejscu na normalną liczbę. Działa również w przypadku miejsc dziesiętnych:
źródło
Dzięki tej funkcji będziesz mógł formatować wartości w wielu formatach, takich jak
1.234,56
i1,234.56
, a nawet z błędami, takimi jak1.234.56
i1,234,56
źródło
Jeśli chcesz uzyskać odpowiedź l10n, zrób to w ten sposób. Przykład używa waluty, ale nie potrzebujesz tego. Biblioteka Intl będzie musiała zostać wypełniona, jeśli musisz obsługiwać starsze przeglądarki.
źródło
replace()
zastępuje pierwsze dopasowanie tylko wtedy, gdy nie jest używaneRegExp
z'g'
flagą.,
którego w niektórych lokalizacjach jest umieszczony separator przecinkówZastąp przecinek pustym ciągiem:
źródło
Jeśli masz mały zestaw języków do obsługi, prawdopodobnie lepiej by było, gdybyś po prostu zakodował kilka prostych reguł:
źródło
źródło
Funkcja split dzieli ciąg znaków na tablicę, używając znaku „,” jako separatora i zwraca tablicę.
Funkcja join łączy elementy tablicy zwrócone przez funkcję split.
Funkcja Number () konwertuje połączony ciąg na liczbę.
źródło