Czy przegapiłem standardowe wywołanie interfejsu API, które usuwa końcowe nieznaczące zera z liczby?
Dawny.
var x = 1.234000 // to become 1.234;
var y = 1.234001; // stays 1.234001
Number.toFixed () i Number.toPrecision () nie są tym, czego szukam.
javascript
regex
math
numbers
Steven
źródło
źródło
1.234000 === 1.234
.parseFloat(n)
?Odpowiedzi:
Jeśli przekonwertujesz go na ciąg, nie wyświetli żadnych końcowych zer, które nie są przechowywane w zmiennej w pierwszej kolejności, ponieważ została utworzona jako liczba, a nie łańcuch.
źródło
var n = 1.245000000000001
(zakładając, że jest to nieistotne dla użytkownika)Miałem podobny przypadek, w którym chciałem użyć w
.toFixed()
razie potrzeby, ale nie chciałem wyściółki, gdy nie było. Skończyło się na użyciu parseFloat w połączeniu z toFixed.Naprawiono bez wypełnienia
Inna opcja, która robi prawie to samo
Ta odpowiedź może pomóc w podjęciu decyzji
toFixed
zaokrągli / dopełni liczbę do określonej długości, ale także zamieni ją na ciąg. Konwersja tego z powrotem na typ liczbowy nie tylko sprawi, że liczba będzie bezpieczniejsza w użyciu arytmetycznym, ale także automatycznie usunie wszystkie końcowe zera. Na przykład:Ponieważ nawet jeśli zdefiniujesz liczbę z końcowymi zerami, zostaną one usunięte.
źródło
parseFloat(n).toFixed(4);
zamiast rzeczywistej odpowiedzi widziałem . Przykro mi.+(n.toFixed(4))
?Najpierw użyłem kombinacji odpowiedzi Matti-Lyry i Gary'ego:
Wyniki:
Dość problematyczny przypadek to 0,10001. Skończyło się na tej dłuższej wersji:
Aktualizacja : A to jest nowsza wersja Gary'ego (patrz komentarze):
Daje to takie same wyniki, jak powyżej.
źródło
toFixed(4).replace(/([0-9]+(\.[1-9]+)?)(\.?0+$)/,"$1")
([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)
replace(/[,.][1-9]+(0+)/,'')
?W
toFixed
razie potrzeby metoda dokona odpowiedniego zaokrąglenia. Doda również końcowe zera, co nie zawsze jest idealne.Jeśli rzucisz wartość zwracaną na liczbę, te końcowe zera zostaną usunięte. Jest to prostsze podejście niż wykonywanie własnych operacji matematycznych zaokrągleń lub obcięć.
źródło
toFixed
wywołanie). to dziwny przypadek UX edge.Miałem zasadniczo te same wymagania i stwierdziłem, że nie ma wbudowanego mechanizmu dla tej funkcji.
Oprócz obcięcia końcowych zer, musiałem również zaokrąglić i sformatować dane wyjściowe dla bieżących ustawień regionalnych użytkownika (tj. 123 456,789).
Cała moja praca nad tym została zawarta jako prettyFloat.js (licencja MIT) na GitHub: https://github.com/dperish/prettyFloat.js
Przykłady użycia:
Aktualizacja - sierpień 2018
Wszystkie nowoczesne przeglądarki obsługują teraz interfejs API ECMAScript Internationalization , który zapewnia porównywanie ciągów tekstowych z uwzględnieniem języka, formatowanie liczb oraz formatowanie daty i godziny.
W przypadku starszych przeglądarek możesz użyć tego wypełnienia: https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en
źródło
A co powiesz na pomnożenie przez jeden w ten sposób?
źródło
Możesz spróbować tego, aby zminimalizować liczby zmienne
źródło
Czysta odpowiedź regex
Zastanawiam się, dlaczego nikt nikogo nie dał!
źródło
Musiałem rozwiązać ten problem również, gdy Django wyświetlał wartości typu dziesiętnego w polu tekstowym. Np. Kiedy „1” było wartością. To pokaże „1,00000000”. Gdyby wartość „1,23” była wartością „1,23000000” (w przypadku ustawienia „miejsca dziesiętne” na 8)
Używanie parseFloat nie było dla mnie opcją, ponieważ możliwe, że nie zwraca dokładnie tej samej wartości. toFixed nie było opcją, ponieważ nie chciałem niczego zaokrąglać, więc utworzyłem funkcję:
źródło
Żadne z tych rozwiązań nie działało dla mnie w przypadku bardzo małych liczb. http://numeraljs.com/ rozwiązało to dla mnie.
źródło
Jeśli z jakiegoś powodu nie możesz użyć zmiennych typu Floats (np. W przypadku przepływów pieniężnych) i już zaczynasz od łańcucha reprezentującego poprawną liczbę, to rozwiązanie może okazać się przydatne. Konwertuje łańcuch reprezentujący liczbę na łańcuch reprezentujący liczbę bez końcowych zer.
źródło
Po przeczytaniu wszystkich odpowiedzi - i komentarzy - skończyło się na tym:
Wiem, że używanie
eval
może być w jakiś sposób szkodliwe, ale bardzo mi to pomogło.Więc:
Jeśli chcesz ograniczyć miejsca dziesiętne, użyj tego,
toFixed()
co wskazali inni.Otóż to.
źródło
Musiałem usunąć wszystkie zera końcowe, ale zachować co najmniej 2 miejsca po przecinku, w tym zera.
Liczby, z którymi pracuję, to 6 ciągów liczb dziesiętnych, generowanych przez .toFixed (6).
Spodziewany wynik:
Rozwiązanie:
Logika:
Uruchom funkcję pętli, jeśli ostatni znak łańcucha to zero.
Usuń ostatni znak i zaktualizuj zmienną łańcuchową.
Jeśli zaktualizowany łańcuch ostatni znak nie jest zerem, kończy się pętla.
Jeśli zaktualizowany łańcuch od trzeciego do ostatniego znaku jest zmiennoprzecinkowym, pętla końcowa.
źródło
Oto możliwe rozwiązanie:
źródło
parseFloat()
będzie bardzo odpowiedni.