Chciałbym sformatować cenę w JavaScript. Chciałbym funkcji, która przyjmuje float
jako argument i zwraca string
sformatowane w ten sposób:
"$ 2,500.00"
Jak najlepiej to zrobić?
javascript
formatting
currency
Daniel Magliola
źródło
źródło
formatNumber
javascript nie ma wbudowanej funkcjiOdpowiedzi:
Number.prototype.toFixed
To rozwiązanie jest kompatybilne z każdą główną przeglądarką:
Wystarczy dodać symbol waluty (np.
"$" + profits.toFixed(2)
), A otrzymasz kwotę w dolarach.Funkcja niestandardowa
Jeśli potrzebujesz użyć
,
między każdą cyfrą, możesz użyć tej funkcji:Używaj go w ten sposób:
Jeśli zawsze będziesz używać „.” i „,” możesz pominąć ich wywołanie metody, a metoda domyślnie je dla ciebie.
Jeśli w twojej kulturze dwa symbole są odwrócone (tj. Europejczycy) i chcesz użyć wartości domyślnych, po prostu wklej następujące dwie linie w
formatMoney
metodzie:Funkcja niestandardowa (ES6)
Jeśli możesz użyć nowoczesnej składni ECMAScript (tj. Poprzez Babel), możesz zamiast tego użyć tej prostszej funkcji:
źródło
d
it
być.
i,
odpowiednio tak, że nie trzeba określać je za każdym razem. Ponadto zalecam zmodyfikowanie początkureturn
instrukcji tak, aby brzmiała:return s + '$' + [rest]
w przeciwnym razie nie otrzymasz znaku dolara.Intl.numberformat
JavaScript ma formatator liczb (część interfejsu API internacjonalizacji).
Skrzypce JS
Użyj
undefined
zamiast pierwszego argumentu ('en-US'
w tym przykładzie), aby użyć ustawień regionalnych systemu (ustawień narodowych użytkownika w przypadku, gdy kod działa w przeglądarce). Dalsze objaśnienie kodu regionalnego .Oto lista kodów walut .
Intl.NumberFormat vs Number.prototype.toLocaleString
Ostatnia uwaga porównująca to do starszych.
toLocaleString
. Oba oferują zasadniczo tę samą funkcjonalność. Jednak toLocaleString w swoich starszych inkarnacjach (pre-Intl) tak naprawdę nie obsługuje ustawień regionalnych : używa ustawień regionalnych systemu. Dlatego upewnij się, że używasz poprawnej wersji ( MDN sugeruje sprawdzenie istnieniaIntl
). Również wydajność obu jest taka sama dla jednego elementu, ale jeśli masz wiele liczb do sformatowania, użycieIntl.NumberFormat
jest ~ 70 razy szybsze. Oto jak używaćtoLocaleString
:Kilka uwag na temat obsługi przeglądarki
źródło
Krótkie i szybkie rozwiązanie (działa wszędzie!)
Ideą tego rozwiązania jest zastąpienie dopasowanych sekcji pierwszym dopasowaniem i przecinkiem, tj
'$&,'
. Dopasowywanie odbywa się przy użyciu metody lookahead . Możesz odczytać wyrażenie „dopasuj liczbę, jeśli następuje po niej ciąg trzech zestawów liczb (jeden lub więcej) i kropka” .TESTY:
PRÓBNY: http://jsfiddle.net/hAfMM/9571/
Rozszerzone krótkie rozwiązanie
Możesz także rozszerzyć prototyp
Number
obiektu, aby dodać dodatkowe wsparcie dla dowolnej liczby miejsc po przecinku[0 .. n]
i wielkości grup liczb[0 .. x]
:DEMO / TESTY: http://jsfiddle.net/hAfMM/435/
Super rozszerzone krótkie rozwiązanie
W tej super rozszerzonej wersji możesz ustawić różne typy ograniczników:
DEMO / TESTY: http://jsfiddle.net/hAfMM/612/
źródło
.replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")
.Number.prototype.toMoney = (decimal=2) -> @toFixed(decimal).replace /(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,"
\.
z$
(koniec linii), tjthis.toFixed(0).replace(/(\d)(?=(\d{3})+$)/g, "$1,")
.$1,
. Dopasowywanie odbywa się przy użyciu metody lookahead . Możesz odczytać wyrażenie „dopasuj liczbę, jeśli następuje po niej ciąg trzech zestawów liczb (jeden lub więcej) i kropka” .Spójrz na obiekt JavaScript Number i sprawdź, czy może ci pomóc.
toLocaleString()
sformatuje liczbę przy użyciu separatora tysięcy określonego dla lokalizacji.toFixed()
zaokrągli liczbę do określonej liczby miejsc po przecinku.Aby użyć ich w tym samym czasie, wartość musi zostać zmieniona z powrotem na liczbę, ponieważ oba generują ciąg.
Przykład:
źródło
toLocaleString
używająca ustawień regionalnych systemu i nowa (niekompatybilna) pochodząca z interfejsu API ECMAScript Intl. Wyjaśniono tutaj . Ta odpowiedź wydaje się być przeznaczona dla starej wersji.Poniżej znajduje się kod Patricka Desjardinsa (pseudonim Daok) z dodanymi uwagami i drobnymi zmianami:
a tutaj kilka testów:
Niewielkie zmiany to:
przeniósł trochę
Math.abs(decimals)
do zrobienia tylko wtedy, gdy nie jestNaN
.decimal_sep
nie może być już pustym ciągiem (pewnego rodzaju separatorem dziesiętnym jest MUSI)używamy
typeof thousands_sep === 'undefined'
zgodnie z sugestią w Jak najlepiej ustalić, czy argument nie jest wysyłany do funkcji JavaScript(+n || 0)
nie jest potrzebny, ponieważthis
jestNumber
obiektemJS Fiddle
źródło
parseInt
jest wartość bezwzględna części INTEGER liczby. Część INTEGER nie może zaczynać się od ZERO, chyba że jest to po prostu ZERO! IparseInt(0) === 0
ósemkowy lub dziesiętny.0
jest uważana za ósemkowąparseInt
. Ale w tym kodzie NIE MOŻNAparseInt
odbierać016
jako danych wejściowych (lub jakiejkolwiek innej wartości sformatowanej ósemkowo), ponieważ przekazywany argumentparseInt
jest przetwarzany przezMath.abs
funkcję. Nie ma więc możliwościparseInt
otrzymania liczby zaczynającej się od zera, chyba że jest to tylko zero lub0.nn
(gdzienn
są miejsca po przecinku). Ale zarówno łańcuchy, jak0
i0.nn
łańcuchy zostałyby przekonwertowaneparseInt
na zwykłą ZERO, jak się przypuszcza.account.js to niewielka biblioteka JavaScript do formatowania liczb, pieniędzy i walut.
źródło
Jeśli kwota jest liczbą, powiedzmy
-123
, towyprodukuje ciąg
"-$123.00"
.Oto kompletny przykład działania .
źródło
minimumFractionDigits: 0
Oto najlepszy formatyzator pieniędzy js, jaki widziałem:
Został ponownie sformatowany i zapożyczony stąd: https://stackoverflow.com/a/149099/751484
Będziesz musiał podać swój własny oznacznik waluty (użyłeś $ powyżej).
Nazwij to w ten sposób (chociaż pamiętaj, że domyślnie argumenty to 2, przecinek i kropka, więc nie musisz podawać żadnych argumentów, jeśli taka jest twoja preferencja):
źródło
var
oświadczeniu.Tutaj są już świetne odpowiedzi. Oto kolejna próba, dla zabawy:
I niektóre testy:
Edytowane: teraz będzie również obsługiwać liczby ujemne
źródło
i = orig.length - i - 1
oddzwanianie. Mimo to o jeden krok mniej w tablicy.reduce
Metoda została wprowadzona w Ecmascript 1.8 i nie jest obsługiwana w Internet Explorerze 8 i niższych.Działa dla wszystkich obecnych przeglądarek
Służy
toLocaleString
do formatowania waluty w jej reprezentacji wrażliwej na język (przy użyciu kodów walut ISO 4217 ).Przykładowe fragmenty kodu Rand południowoafrykańskiego dla @avenmore
źródło
Myślę, że chcesz
f.nettotal.value = "$" + showValue.toFixed(2);
źródło
Numeral.js - biblioteka js do łatwego formatowania liczb przez @adamwdraper
źródło
Ok, na podstawie tego, co powiedziałeś, używam tego:
Jestem otwarty na propozycje ulepszeń (wolę nie uwzględniać YUI tylko po to :-)) Wiem już, że powinienem wykrywać „.” zamiast po prostu używać go jako separatora dziesiętnego ...
źródło
Korzystam z biblioteki Globalize (od Microsoft):
To świetny projekt do lokalizowania liczb, walut i dat oraz automatycznego formatowania ich zgodnie z ustawieniami użytkownika! ... i pomimo tego, że powinno to być rozszerzenie jQuery, jest to obecnie w 100% niezależna biblioteka. Proponuję wam wszystkim wypróbować! :)
źródło
javascript-number-formatter (wcześniej w Google Code )
Tylko 75 wierszy, w tym informacje o licencji MIT, puste wiersze i komentarze.#,##0.00
lub z negacją-000.####
.# ##0,00
,#,###.##
,#'###.##
lub dowolnego typu non-numeracji symbolem.#,##,#0.000
lub#,###0.##
wszystkie są ważne.##,###,##.#
lub0#,#00#.###0#
wszystko w porządku.format( "0.0000", 3.141592)
.(fragment z README)
źródło
+1 Jonathanowi M. za dostarczenie oryginalnej metody. Ponieważ jest to jawnie formatator walut, poszedłem dalej i dodałem symbol waluty (domyślnie „$”) do danych wyjściowych i dodałem domyślny przecinek jako separator tysięcy. Jeśli tak naprawdę nie chcesz symbolu waluty (lub separatora tysięcy), po prostu użyj argumentu „” (pusty ciąg) jako argumentu.
źródło
+n || 0
to jedyna rzecz, która wydaje mi się nieco dziwna (w każdym razie dla mnie).this
to doskonale przydatna nazwa zmiennej. Przekształcenie go w celun
zapisania 3 znaków w czasie definicji mogło być konieczne w erze, w której RAM i przepustowość były liczone w KB, ale jest jedynie zaciemniające w erze, w której minimalizator zajmie się tym wszystkim, zanim dotrze do produkcji. Inne sprytne mikrooptymalizacje są przynajmniej dyskusyjne.Istnieje port javascript funkcji PHP „number_format”.
Uważam, że jest bardzo przydatny, ponieważ jest łatwy w użyciu i rozpoznawalny dla programistów PHP.
(Blok komentarza do oryginału , zamieszczony poniżej w celu uzyskania przykładów i zaliczek w odpowiednim czasie)
źródło
Krótsza metoda (do wstawiania spacji, przecinka lub punktu) z wyrażeniem regularnym?
źródło
Nie widziałem czegoś takiego. Jest dość zwięzły i łatwy do zrozumienia.
Oto wersja z większą ilością opcji na końcowym wyjściu, umożliwiającą formatowanie różnych walut w różnych formatach lokalizacyjnych.
źródło
Odpowiedź Patricka Desjardinsa wygląda dobrze, ale wolę mój javascript prosty. Oto funkcja, którą właśnie napisałem, aby pobrać liczbę i zwrócić ją w formacie walutowym (minus znak dolara)
źródło
Główną częścią jest wstawienie separatorów tysiąca, które można wykonać w następujący sposób:
źródło
Jest wbudowany w
function
toFixed wjavascript
źródło
toFixed()
toFixed()
jest funkcjąNumber
obiektu i nie działałby,var num
gdyby byłString
, więc dodatkowy kontekst pomógł mi.Od WillMaster .
źródło
Sugeruję klasę NumberFormat z interfejsu API Google Visualization .
Możesz zrobić coś takiego:
Mam nadzieję, że to pomoże.
źródło
To może być trochę za późno, ale oto metoda, którą właśnie opracowałem dla współpracownika, aby dodać funkcję rozpoznawania ustawień regionalnych
.toCurrencyString()
do wszystkich liczb. Internalizacja służy wyłącznie do grupowania liczb, a NIE znaku waluty - jeśli wyprowadzasz dolary, użyj tego,"$"
co podano, ponieważ$123 4567
w Japonii lub Chinach jest tyle samo dolarów, co$1,234,567
w USA. Jeśli wypisujesz euro / itp., Zmień znak waluty z"$"
.Zadeklaruj to w dowolnym miejscu w SZEFIE lub tam, gdzie to konieczne, tuż przed użyciem:
To koniec! Użyj
(number).toCurrencyString()
wszędzie tam, gdzie chcesz podać liczbę jako walutę.źródło
Jak zwykle istnieje wiele sposobów na zrobienie tego samego, ale unikałbym używania,
Number.prototype.toLocaleString
ponieważ może zwrócić różne wartości w zależności od ustawień użytkownika.Nie polecam także rozszerzania
Number.prototype
- rozszerzanie prototypów obiektów natywnych jest złą praktyką, ponieważ może powodować konflikty z kodem innych osób (np. Bibliotek / frameworków / wtyczek) i może nie być kompatybilne z przyszłymi implementacjami / wersjami JavaScript.Uważam, że Wyrażenia regularne są najlepszym podejściem do problemu, oto moja implementacja:
edytowany 30.08.2010: dodano opcję ustawiania liczby cyfr dziesiętnych. edytowany w dniu 2011/08/23: dodano opcję ustawienia liczby cyfr dziesiętnych na zero.
źródło
Oto niektóre rozwiązania, wszystkie przeszły pakiet testowy, pakiet testowy i test porównawczy, jeśli chcesz skopiować i wkleić w celu przetestowania, wypróbuj This Gist .
Metoda 0 (RegExp)
Oprzyj na https://stackoverflow.com/a/14428340/1877620 , ale popraw, jeśli nie ma kropki dziesiętnej.
Metoda 1
Metoda 2 (Podziel na macierz)
Metoda 3 (pętla)
Przykład użycia
Separator
Jeśli chcemy niestandardowego separatora tysięcy lub separatora dziesiętnego, użyj
replace()
:Zestaw testowy
Reper
źródło
źródło
Prosta opcja dla prawidłowego umieszczania przecinków poprzez odwrócenie pierwszego łańcucha i podstawowe wyrażenie regularne.
źródło
Znalazłem to z: account.js . Jest to bardzo łatwe i idealnie pasuje do moich potrzeb.
źródło
$('#price').val( accounting.formatMoney(OOA, { symbol: "€", precision: 2,thousand: ".", decimal :",",format: "%v%s" } ) );
- pokaż 1.000,00 E