Próbuję odczytać niektóre wartości BigDecimal z ciągu. Powiedzmy, że mam ten ciąg: „1,000,000,000.999999999999999” i chcę uzyskać z niego BigDecimal. Jak to zrobić?
Przede wszystkim nie podobają mi się rozwiązania wykorzystujące zamiany ciągów znaków (zastępowanie przecinków itp.). Myślę, że powinien być jakiś zgrabny formater do wykonania tej pracy za mnie.
Znalazłem klasę DecimalFormatter, ale ponieważ działa podwójnie - tracone są ogromne ilości precyzji.
Więc jak mogę to zrobić?
java
parsing
bigdecimal
bezmax
źródło
źródło
BigDecimal
.Odpowiedzi:
Sprawdź
setParseBigDecimal
w DecimalFormat. Z tym ustawiaczem,parse
zwróci za Ciebie BigDecimal.źródło
Pełny kod, aby udowodnić, że nie
NumberFormatException
jest wyrzucane:Wynik
źródło
1000000000.999999999999999
DecimalFormatSymbols.getInstance().getGroupingSeparator()
Zamiast przecinka, nie musisz przejmować się różnymi lokalizacjami.Poniższy przykładowy kod działa dobrze (ustawienia regionalne należy pobierać dynamicznie)
źródło
Kod może być czystszy, ale wydaje się, że działa to w różnych lokalizacjach.
źródło
Oto jak bym to zrobił:
Oczywiście, gdyby chodziło o kod produkcyjny, nie byłoby to takie proste.
Nie widzę problemu po prostu usuwając przecinki z ciągu.
źródło
Potrzebowałem rozwiązania do przekonwertowania String na BigDecimal bez znajomości ustawień regionalnych i niezależności od ustawień regionalnych. Nie mogłem znaleźć żadnego standardowego rozwiązania tego problemu, więc napisałem własną metodę pomocniczą. Może pomoże to również komukolwiek innemu:
Aktualizacja: Ostrzeżenie! Ta pomocnicza metoda działa tylko w przypadku liczb dziesiętnych, a więc liczb, które zawsze mają kropkę dziesiętną! W przeciwnym razie metoda pomocnicza może dać błędny wynik dla liczb od 1000 do 999999 (plus / minus). Dzięki bezmax za jego wielki wkład!
Oczywiście przetestowałem metodę:
źródło
7,333
oznacza? Czy to 7333 czy 7 i 1/3 (7,333)? W różnych lokalizacjach numer ten byłby analizowany inaczej. Oto dowód słusznościusunie wszystkie znaki z wyjątkiem cyfr i kropki z twojego ciągu.
Aby był zgodny z lokalizacją, możesz użyć
getDecimalSeparator()
fromjava.text.DecimalFormatSymbols
. Nie znam Javy, ale może to wyglądać tak:źródło
Stary temat, ale może najłatwiejszy jest użycie Apache commons NumberUtils, który ma metodę createBigDecimal (wartość ciągu) ....
Myślę (mam nadzieję), że bierze pod uwagę lokalizacje, inaczej byłoby to raczej bezużyteczne.
źródło
Spróbuj, to działa dla mnie
źródło