Jeśli sformatować podwójne przy użyciu metody toString
, to otrzymam pełną precyzję podwójnego. Na przykład (stosując Scala składni)Jak mogę wyprowadzać zlokalizowane wartości zmiennoprzecinkowe Java w pełnej precyzji?
java.text.MessageFormat.format ("{0}", Math.PI.toString)
spowoduje łańcuch zawierający:
3.141592653589793
jednak, wartość ta jest zlokalizowany. Gdybym przechodzą podwójną wartość jako pudełkowej Double
, że jest tak:
java.text.MessageFormat.format ("{0}", Math.PI.asInstanceOf[AnyRef])
(AnyRef
jest Scala typ, który jest odpowiednikiem Object
w Java), a następnie wynik jest zlokalizowana ciąg z obcinane precyzja:
3.142
wynik jest taki sam, nawet jeśli dodać więcej podpowiedź do łańcucha format:
java.text.MessageFormat.format ("{0,number}", Math.PI.asInstanceOf[AnyRef])
mogę uzyskać pełną precyzję określając format niestandardowy:
java.text.MessageFormat.format ("{0,number,#.###############}", Math.PI.asInstanceOf[AnyRef])
ale to wymaga pewnej wiedzy o podwójnej wielkości i precyzji. Jeśli drukuję jakąkolwiek podwójną wartość (nie tylko Pi) i chcę zachować pełną precyzję wartości, to podejście to oznacza, że muszę dynamicznie zmieniać ciąg formatu - i to nie jest dogodnie wygodne, jeśli (jak w w moim przypadku) łańcuch formatu jest faktycznie uzyskiwany z pakunku zasobów. Na przykład rozważ podwójną wartość . Konwertowanie na ciąg znaków jako pierwsze i użycie "{0}" jako ciągu formatu powoduje, że odpowiednia, ale nieokreślona, wartość ciągu znaków to 1.0E37
. Jeśli przekażę to jako zapakowany Double
z ciągiem formatu "{0, numer}", otrzymam śmieszną wartość 10,000,000,000,000,000,000,000,000,000,000,000,000
.
Podsumowując, nie mogę znaleźć ciągu formatu, który zachowuje pełną precyzję podwójnego kształtu bez uprzedniego przekonwertowania go na ciąg znaków - i to jest coś, co wolałbym uniknąć, tak jak zarazy. Czy istnieje ciąg formatu liczbowego, który wyświetla pełną dokładność podwójnego jako zlokalizowanej wartości?
UPDATE:
Właśnie w celu wyjaśnienia, dlaczego wolałbym nie mieć do konwersji podwójnych do strun:
toString
powrotów, o ile jestem w stanie powiedzieć, ważny Java podwójna wartość dosł. Jako ciąg wynik nie jest zlokalizowany po przekazaniu doMessageFormat.format
. Na przykład powiedzmy, że chcę wyprowadzić zlokalizowaną postać o wartości1234.567
.toString
zwróci"1234.567"
, aMessageFormat.format
zostawi to na tym. W porządku. Mam swoją dokładność. Jednak w Niemczech miałoby to więcej sensu, gdyby pojawił się jako"1.234,567"
. Nawet w USA/Wielkiej Brytanii wyglądałoby to ładniej, gdyby wyglądało na"1,234.567"
.- Jeśli mijam zapakowane
Integer
,Boolean
, lub inny niż zmiennoprzecinkowych prymitywny typ doMessageFormat.format
(z prostym „{n}” format), a potem się ładnie zlokalizowana, pełna moc precyzja. Nie potrzebuję - i nie powinienem, ponieważ stracę zlokalizowane dane wyjściowe - najpierw konwertuj te wartości na ciągi. Oznacza to, że muszę traktować double (i float orazBigDecimal
s) inaczej i konwertować je na ciągi przed przekazaniem ich doMessageFormat.format
. (Co więcej, muszę to robić za każdym razem.)
"BigDecimal" może? –
Nie potrzebuję "BigDecimal" - regularne podwójne jest w porządku dla moich celów. Konwersja do BigDecimal jest tak samo uciążliwa dla mnie jak konwersja na ciąg znaków. –
Po prostu próbowałem konwertować 'PI' na BigDecimal i wyprowadzałem ... ... i otrzymałem' 3.142', więc to też nie działa. ;-) –