Próbuję wydrukować liczbę całkowitą w JavaScript z przecinkami jako tysiące separatorów. Na przykład chcę pokazać liczbę 1234567 jako „1 234 567”. Jak miałbym to zrobić?
Oto jak to robię:
function numberWithCommas(x) {
x = x.toString();
var pattern = /(-?\d+)(\d{3})/;
while (pattern.test(x))
x = x.replace(pattern, "$1,$2");
return x;
}
Czy istnieje prostszy lub bardziej elegancki sposób na zrobienie tego? Byłoby miło, gdyby działał również z pływakami, ale nie jest to konieczne. Aby wybierać między kropkami a przecinkami, nie musi być zależny od ustawień regionalnych.
javascript
formatting
numbers
Elias Zamaria
źródło
źródło
Number.prototype.toLocaleString
nadal nie działa w Safari w 2016 roku . Zamiast faktycznie formatować liczbę, po prostu ją zwraca, bez zgłaszania błędu. Posiadanie największego facepalmu w wyniku tego ... #goodworkAppleOdpowiedzi:
Wykorzystałem pomysł z odpowiedzi Kerry, ale uprościłem go, ponieważ szukałem czegoś prostego do mojego konkretnego celu. Oto co zrobiłem:
Pokaż fragment kodu
Wyrażenie regularne używa 2 asercji:
Na przykład, jeśli go zdasz
123456789.01
, asercja dodatnia będzie pasować do każdego miejsca po lewej stronie 7 (ponieważ789
jest wielokrotnością 3 cyfr,678
jest wielokrotnością 3 cyfr567
itp.). Twierdzenie negatywne sprawdza, czy wielokrotność 3 cyfr nie ma po nim żadnych cyfr.789
ma kropkę po nim, więc jest dokładnie wielokrotnością 3 cyfr, więc przecinek tam.678
jest wielokrotnością 3 cyfr, ale ma9
po nim, więc te 3 cyfry są częścią grupy 4, a przecinek tam nie występuje. Podobnie dla567
.456789
ma 6 cyfr, co jest wielokrotnością 3, więc przecinek poprzedza.345678
jest wielokrotnością 3, ale ma9
po nim, więc nie ma tam przecinka. I tak dalej. The\B
powstrzymuje wyrażenie regularne przed wstawieniem przecinka na początku łańcucha.@ neu-rah wspomniał, że ta funkcja dodaje przecinki w niepożądanych miejscach, jeśli po przecinku są więcej niż 3 cyfry. Jeśli jest to problem, możesz użyć tej funkcji:
Pokaż fragment kodu
@ tjcrowder zwrócił uwagę, że teraz, gdy JavaScript ma lookbehind ( informacje o pomocy technicznej ), można go rozwiązać w samym wyrażeniu regularnym:
Pokaż fragment kodu
(?<!\.\d*)
jest negatywnym wyglądem, który mówi, że dopasowanie nie może być poprzedzone.
przez zero lub więcej cyfr. Negatywne spojrzenie jest szybsze niż rozwiązaniesplit
ijoin
( porównanie ), przynajmniej w V8.źródło
Dziwi mnie, że nikt nie wspominał o Number.prototype.toLocaleString . Jest zaimplementowany w JavaScript 1.5 (który został wprowadzony w 1999 roku), więc jest zasadniczo obsługiwany we wszystkich głównych przeglądarkach.
Działa również w Node.js od v0.12 poprzez włączenie Intl
Zwróć uwagę, że ta funkcja zwraca ciąg, a nie liczbę.
Jeśli chcesz czegoś innego, Numeral.js może być interesujący.
źródło
var number = 123456.000; number.toLocaleString('en-US', {minimumFractionDigits: 2}); "123,456.00"
te opcje nie działają jednak w FF i Safari.X XXX XXX,YYY
).toLocaleString
działa w Node.js od v0.12 poprzez włączenie Intl .parseInt("1234567", 10).toLocaleString('en-US', {minimumFractionDigits: 2})
lubnew Number("1234567").toLocaleString('en-US', {minimumFractionDigits: 2})
zamiast tego. To nie działa, ponieważ używasz go na łańcuchu, a nie na liczbie.⚠ umysł że JavaScript ma maksymalną całkowitą wartość 9007199254740991
toLocaleString :
NumberFormat ( Safari nie jest obsługiwane):
Z tego, co sprawdziłem (przynajmniej Firefox), oba są mniej więcej takie same pod względem wydajności.
źródło
toLocaleString
prace na safari, opcje nietoLocaleString
rozwiązanie powinno prawdopodobnie także pożądany lokum, taktoLocaleString("en")
, ponieważ Anglicy używają wzór przecinków. Jeśli jednaktoLocaleString()
we Francji nie zostanie uruchomiony wskaźnik ustawień regionalnych, wówczas zamiast przecinków będą pojawiać się kropki, ponieważ używa się tego do lokalnego oddzielenia tysięcy.Sugeruję użycie phpjs.org ' number_format ()
AKTUALIZACJA 02/13/14
Ludzie zgłaszali, że to nie działa zgodnie z oczekiwaniami, więc zrobiłem JS Fiddle, który zawiera automatyczne testy.
Aktualizacja 26.11.2017
Oto skrzypce jako fragment kodu z nieznacznie zmodyfikowanymi danymi wyjściowymi:
źródło
Jest to odmiana odpowiedzi @ mikez302, ale zmodyfikowana w celu obsługi liczb dziesiętnych (według opinii @ neu-rah, że liczbaWithCommas (12345.6789) -> „12 345,6,789” zamiast „12 345 6789”
źródło
źródło
Używanie wyrażenia regularnego
Korzystanie z toLocaleString ()
ref MDN: Number.prototype.toLocaleString ()
Korzystanie z Intl.NumberFormat ()
ref Intl.NumberFormat
DEMO W TUTAJ
Wydajność
http://jsben.ch/sifRd
źródło
Intl.NumberFormat
Natywna funkcja JS. Obsługiwane przez IE11, Edge, najnowsze Safari, Chrome, Firefox, Opera, Safari na iOS i Chrome na Androida.
źródło
Dziękujemy wszystkim za odpowiedzi. Zbudowałem niektóre z odpowiedzi, aby stworzyć bardziej „uniwersalne” rozwiązanie.
Pierwszy fragment dodaje funkcję, która naśladuje PHP „S
number_format()
do prototypu Number. Jeśli formatuję liczbę, zwykle chcę miejsc dziesiętnych, więc funkcja przyjmuje liczbę miejsc dziesiętnych do wyświetlenia. Niektóre kraje używają przecinków jako dziesiętnych i dziesiętnych jako separatora tysięcy, więc funkcja umożliwia ustawienie tych separatorów.Użyłbyś tego w następujący sposób:
Odkryłem, że często potrzebowałem odzyskać liczbę dla operacji matematycznych, ale parseFloat konwertuje 5000 na 5, po prostu biorąc pierwszą sekwencję wartości całkowitych. Stworzyłem więc własną funkcję konwersji float i dodałem ją do prototypu String.
Teraz możesz korzystać z obu funkcji w następujący sposób:
źródło
var parts = this.toFixed(decimals).toString().split('.');
var dec_point
. Dzięki za zwrócenie na to uwagi.Jestem pod wrażeniem liczby odpowiedzi, jakie otrzymałem na to pytanie. Podoba mi się odpowiedź uKolka :
Niestety, w niektórych lokalizacjach, takich jak hiszpański, nie działa (IMHO) zgodnie z oczekiwaniami dla liczb poniżej 10 000:
Daje
1000
i nie1.000
.Zobacz , dlaczego toLocaleString nie działa na liczbach mniejszych niż 10000 we wszystkich przeglądarkach, aby wiedzieć, dlaczego.
Musiałem więc użyć odpowiedzi Eliasa Zamarii, wybierając odpowiedni znak separatora tysięcy:
Ten działa dobrze jako jednolinijka dla obu lokalizacji, które używają
,
lub.
jako separatora tysięcy, i zaczyna działać od 1000 we wszystkich przypadkach.Daje
1.000
w kontekście hiszpańskich ustawień regionalnych.Jeśli chcesz mieć absolutną kontrolę nad sposobem formatowania liczby, możesz również spróbować:
Daje
1,234.57
.Ten nie wymaga wyrażenia regularnego. Działa poprzez dostosowanie liczby do pożądanej liczby miejsc po przecinku za pomocą
toFixed
najpierw, a następnie podzielenie jej wokół punktu dziesiętnego,.
jeśli taki istnieje. Lewa strona jest następnie przekształcana w tablicę cyfr, która jest odwrócona. Następnie separator tysięcy jest dodawany co trzy cyfry od początku, a wynik ponownie odwracany. Ostatecznym rezultatem jest połączenie dwóch części. Znak numeru wejściowego jestMath.abs
najpierw usuwany, a następnie w razie potrzeby odkładany.Nie jest to jedna linijka, ale niewiele dłużej i łatwo można ją przekształcić w funkcję. Zmienne zostały dodane dla jasności, ale można je zastąpić ich pożądanymi wartościami, jeśli są znane z góry. Możesz użyć wyrażeń, które wykorzystają
toLocaleString
jako sposób na znalezienie odpowiednich znaków po przecinku i separatora tysięcy dla bieżących ustawień narodowych (pamiętaj, że wymagają one bardziej nowoczesnego Javascript).źródło
Myślę, że to najkrótsze wyrażenie regularne, które to robi:
Sprawdziłem to na kilku numerach i zadziałało.
źródło
Number.prototype.toLocaleString()
byłby niesamowity, gdyby był dostarczany natywnie przez wszystkie przeglądarki (Safari) .Sprawdziłem wszystkie inne odpowiedzi, ale chyba nikt ich nie wypełnił. Oto pocenie w tym kierunku, które jest właściwie kombinacją dwóch pierwszych odpowiedzi; jeśli
toLocaleString
działa, używa go, jeśli nie, używa niestandardowej funkcji.źródło
0.12345
wyświetli0.12,345
. Dobrą implementację do tego można znaleźć w Underscore.stringvalue > 1000
ustawienie warunku if naprawia ten przypadek, ale był to poc i oczywiście lepiej przetestowane wersje można znaleźć gdzie indziej, dzięki za zwrócenie uwagi.value > 1000
podać, ponieważ byłby taki sam dla dowolnej liczby i więcej niż 3 miejsc po przecinku. np .1000.12345
zwraca1,000.12,345
. Twoja odpowiedź jest świetna i na właściwej ścieżce, ale po prostu niepełna. Próbowałem tylko wskazać na inne osoby, które mogą natknąć się na twoją odpowiedź i po prostu skopiować / wkleić ją bez testowania z różnymi danymi wejściowymi.Separator tysięcy można wstawić w przyjazny dla świata sposób za pomocą
Intl
obiektu przeglądarki :Zobacz artykuł MDN na temat NumberFormat, aby dowiedzieć się więcej, możesz określić zachowanie regionalne lub domyślne dla użytkownika. Jest to nieco bardziej niezawodne, ponieważ uwzględnia lokalne różnice; wiele krajów używa kropek do oddzielania cyfr, a przecinek oznacza miejsca po przecinku.
Intl.NumberFormat nie jest jeszcze dostępny we wszystkich przeglądarkach, ale działa w najnowszych przeglądarkach Chrome, Opera i IE. Kolejne wydanie Firefoksa powinno go obsługiwać. Wydaje się, że Webkit nie ma harmonogramu wdrożenia.
źródło
Możesz użyć tej procedury do sformatowania potrzebnej waluty.
Aby uzyskać więcej informacji, możesz uzyskać dostęp do tego linku.
https://www.justinmccandless.com/post/formatting-currency-in-javascript/
źródło
jeśli masz do czynienia z wartościami walutowymi i dużo formatujesz, może warto dodać malutką księgowość.js, która obsługuje wiele przypadków brzegowych i lokalizacji:
źródło
Poniższy kod wykorzystuje skanowanie znaków, więc nie ma wyrażenia regularnego.
Pokazuje obiecującą wydajność: http://jsperf.com/number-formatting-with-commas/5
2015.4.26: Drobna poprawka rozwiązująca problem, gdy numer <0. Zobacz https://jsfiddle.net/runsun/p5tqqvs3/
źródło
commafy(-123456)
tym daje-,123,456
Oto prosta funkcja, która wstawia przecinki dla tysięcy separatorów. Używa funkcji tablicowych zamiast RegEx.
Link CodeSandbox z przykładami: https://codesandbox.io/s/p38k63w0vq
źródło
Użyj tego kodu do obsługi formatu waluty dla Indii. Kod kraju można zmienić w celu obsługi innej waluty krajowej.
wynik:
źródło
Możesz także użyć konstruktora Intl.NumberFormat . Oto jak możesz to zrobić.
źródło
Napisałem to przed natknięciem się na ten post. Bez wyrażeń regularnych i możesz naprawdę zrozumieć kod.
źródło
EDYCJA: Funkcja działa tylko z liczbą dodatnią. na przykład:
Wyjście: „123 123 123 232 232”
Ale odpowiedź na powyższe pytanie
toLocaleString()
rozwiązuje problem.Wyjście: „123 123 123 232 232”
Dopingować!
źródło
Moja odpowiedź jest jedyną odpowiedzią, która całkowicie zastępuje jQuery bardziej sensowną alternatywą:
To rozwiązanie nie tylko dodaje przecinki, ale także zaokrągla do najbliższego grosza, jeśli wpiszesz kwotę, np.
$(1000.9999)
Dostaniesz 1 001 USD. Dodatkowo wprowadzana wartość może być bezpiecznie liczbą lub łańcuchem; to nie ma znaczenia.Jeśli masz do czynienia z pieniędzmi, ale nie chcesz, aby na kwoty pokazywał się wiodący znak dolara, możesz również dodać tę funkcję, która korzysta z poprzedniej funkcji, ale usuwa
$
:Jeśli nie do czynienia z pieniędzmi, i mają różne wymagania formatowanie dziesiętne, tutaj jest bardziej wszechstronny funkcji:
A tak przy okazji, fakt, że ten kod nie działa w niektórych starych wersjach Internet Explorera, jest całkowicie zamierzony. Staram się przełamać IE za każdym razem, kiedy mogę go złapać, nie wspierając nowoczesnych standardów.
Pamiętaj, że nadmierne pochwały w komentarzach są uważane za nie na temat. Zamiast tego, po prostu obsyp mnie mnie głosami większymi.
źródło
Dla mnie najlepszą odpowiedzią jest użycie metody toLocaleString, jak powiedzieli niektórzy członkowie. Jeśli chcesz dołączyć symbol „$”, po prostu dodaj languaje i wpisz opcje. Oto i przykład sformatowania liczby w peso meksykańskie
skrót
źródło
Pozwól mi spróbować poprawić uKolka „s odpowiedź i może pomóc innym zaoszczędzić trochę czasu.
Użyj Numeral.js .
Powinieneś korzystać z Number.prototype.toLocaleString () tylko wtedy, gdy kompatybilność przeglądarki nie stanowi problemu.
źródło
Alternatywny sposób, obsługujący miejsca po przecinku, różne separatory i negatywy.
Kilka poprawek @Jignesh Sanghani, nie zapomnij pochwalić jego komentarza.
źródło
fn.substr(0, i)
zamień na,n.substr(0, i)
a takżenumber.toFixed(dp).split('.')[1]
zamień naparseFloat(number).toFixed(dp).split('.')[1]
. ponieważ kiedy używam bezpośrednio, daje mi to błąd. zaktualizuj swój kodMyślę, że ta funkcja zajmie się wszystkimi problemami związanymi z tym problemem.
źródło
Tylko dla przyszłych Googlersów (lub niekoniecznie „Googlersów”):
Wszystkie powyższe rozwiązania są wspaniałe, jednak RegExp może być okropnie złą rzeczą w takiej sytuacji.
Tak, możesz użyć niektórych z proponowanych opcji lub nawet napisać coś prymitywnego, ale przydatnego, takiego jak:
Wyrażenie regularne, które tu zastosowano, jest dość proste, a pętla przejdzie dokładnie tyle razy, ile potrzeba, aby wykonać zadanie.
Możesz go zoptymalizować znacznie lepiej, kodować „DRYify” i tak dalej.
Jeszcze,
(w większości sytuacji) byłby zdecydowanie lepszym wyborem.
Nie chodzi o szybkość wykonywania ani kompatybilność z różnymi przeglądarkami.
W sytuacjach, gdy chcesz pokazać wynikowy numer użytkownikowi, metoda .toLocaleString () daje ci superumiejętność mówienia tym samym językiem z użytkownikiem witryny lub aplikacji (niezależnie od tego, jaki jest jego język).
Ta metoda zgodnie z dokumentacją ECMAScript została wprowadzona w 1999 r. I uważam, że powodem tego była nadzieja, że Internet w pewnym momencie połączy ludzi na całym świecie, dlatego potrzebne były pewne narzędzia „internalizacji”.
Dzisiaj Internet łączy nas wszystkich, dlatego ważne jest, aby pamiętać, że świat jest znacznie bardziej złożony, niż moglibyśmy to sobie wyobrazić, i że (/ prawie) wszyscy jesteśmy tutaj , w Internecie.
Oczywiście, biorąc pod uwagę różnorodność ludzi, nie jest możliwe zagwarantowanie każdemu idealnego UX, ponieważ mówimy różnymi językami, cenimy różne rzeczy itp. I właśnie z tego powodu jeszcze ważniejsze jest, aby spróbować zlokalizować rzeczy tak bardzo, jak to możliwe .
Biorąc pod uwagę, że istnieją pewne szczególne standardy reprezentacji daty, godziny, liczb itp. I że mamy narzędzie do wyświetlania tych rzeczy w formacie preferowanym przez użytkownika końcowego, nie jest to rzadkie i prawie nieodpowiedzialne, aby nie skorzystać z tego narzędzia (szczególnie w sytuacjach, gdy chcemy wyświetlić te dane użytkownikowi)?
Dla mnie używanie RegExp zamiast .toLocaleString () w takiej sytuacji brzmi trochę jak tworzenie aplikacji zegara z JavaScript i kodowanie go w taki sposób, aby wyświetlał tylko czas w Pradze (co byłoby całkiem bezużyteczne dla ludzie, którzy nie mieszkają w Pradze), mimo że zachowanie domyślne
jest zwracanie danych zgodnie z zegarem użytkownika końcowego.
źródło
Moje „ prawdziwe ” rozwiązanie tylko dla wyrażeń regularnych dla tych, którzy kochają jedno-linijki
Widzisz tych entuzjastycznych graczy powyżej? Może możesz z tego grać w golfa. Oto mój ruch.
Używa
CIENKIEJ PRZESTRZENI (U + 2009) dla separatora tysięcy, jak to powiedział Międzynarodowy System Jednostek w ósmym wydaniu (2006) ich publikacji „ SI Broszura: Międzynarodowy System Jednostek (SI) ” (patrz § 5.3 .4.). Dziewiąte wydanie (2019) sugeruje, aby wykorzystać na to miejsce (patrz §5.4.4.). Możesz użyć, co chcesz, w tym przecinek.
Widzieć.
Jak to działa?
Dla części całkowitej
.replace(……, " I ")
Wpisz „ja”/……/g
na każdym z\B
pomiędzy dwiema sąsiednimi cyframi(?=……)
POZYTYWNA LOOKAHEAD, której prawą częścią jest(\d{3})+
jeden lub więcej trzycyfrowych fragmentów\b
po którym następuje cyfra, taka jak kropka, zakończenie łańcucha itp.(?<!……)
NEGATYWNE SPOJRZENIE, wyłączając te, których lewa część\.\d+
to kropka, po której następują cyfry („ma separator dziesiętny”).Za część dziesiętną
.replace(……, " F ")
Wpisz „F”/……/g
na każdym z\B
pomiędzy dwiema sąsiednimi cyframi(?<=……)
POZYTYWNE SPOJRZENIE, którego lewą częścią jest\.
separator dziesiętny(\d{3})+
a następnie jeden lub więcej trzycyfrowych fragmentów.Klasy postaci i granice
Kompatybilność z przeglądarkami
źródło
Dodałem tofixed do rozwiązania Aki143S . To rozwiązanie wykorzystuje kropki dla tysięcy separatorów i przecinek dla precyzji.
Przykłady;
źródło
Wiele dobrych odpowiedzi już. Oto kolejna, dla zabawy:
Kilka przykładów:
źródło
format(-123456)
tym daje-,123,456