Если я отформатирую двойной метод, используя метод toString
, я получу полную точность двойника. Так, например (с использованием Scala синтаксис):Как я могу выводить локализованные значения с плавающей запятой Java с полной точностью?
java.text.MessageFormat.format ("{0}", Math.PI.toString)
приведет к строке, содержащей:
3.141592653589793
Однако это значение не локализован. Если я передать двойное значение как в штучной упаковке Double
, то есть как:
java.text.MessageFormat.format ("{0}", Math.PI.asInstanceOf[AnyRef])
(AnyRef
является Скала типа, который эквивалентен Object
в Java), то результат является локализованной строкой с усеченным точность:
3.142
результат такой же, даже если добавить еще намек на формат строки:
java.text.MessageFormat.format ("{0,number}", Math.PI.asInstanceOf[AnyRef])
я могу получить полную точность, указав пользовательский формат:
java.text.MessageFormat.format ("{0,number,#.###############}", Math.PI.asInstanceOf[AnyRef])
, но это требует некоторого знания величины дубля и точности. Если я печатаю любое двойное значение (а не только Pi) и хочу сохранить полную точность значения, то этот подход означает, что мне приходится динамически изменять строку формата - и это не совсем удобно, если (как в мой случай) строка формата фактически получена из комплекта ресурсов.
Например, рассмотрите двойное значение 1.0e37
. Сначала преобразование в строку и использование «{0}» в качестве строки формата приводит к соответствующему, но нелокализованному строковому значению 1.0E37
. Если я передам это как коробку Double
с строкой формата «{0, number}», то получаю смехотворное значение 10,000,000,000,000,000,000,000,000,000,000,000,000
.
Короче говоря, я не могу найти строку формата, которая сохраняет полную точность двойника без предварительного преобразования ее в строку - и это то, что я бы предпочел избежать, как чума. Есть ли строка формата чисел, которая выводит полную точность двойника как локализованное значение?
UPDATE:
Просто чтобы прояснить, почему я предпочел бы не иметь, чтобы преобразовать двойников в строки:
toString
возвращается, насколько я могу сказать, действительный Java двухсловное значение. В качестве строки результат не локализуется при передачеMessageFormat.format
. Например, скажите, что я хочу вывести локализованную форму значения1234.567
.toString
вернет"1234.567"
, иMessageFormat.format
оставит это на этом. Хорошо. У меня есть точность. Однако в Германии это имело бы больше смысла, если бы оно появилось как"1.234,567"
. Даже в США/Великобритании это выглядело бы лучше, если бы оно появилось как"1,234.567"
.- Если я прохожу в штучной упаковке
Integer
,Boolean
, или любой другой не плавающей точкой примитивного типа вMessageFormat.format
(с помощью простого «{п}» формат), то я получаю хорошо локализованы, полная точность вывода. Мне не нужно - и не должен, поскольку я потеряю локализованный вывод - сначала преобразую эти значения в строки. Это означает, что я должен обрабатывать двойные (и поплавки иBigDecimal
с) по-разному и преобразовывать их в строки перед передачей ихMessageFormat.format
. (Более того, я должен помнить об этом каждый раз.)
'BigDecimal' может быть? –
Мне не нужен «BigDecimal» - обычный двойной вариант подходит для моих целей. Преобразование в BigDecimal столь же громоздко для меня, как преобразование в строку. –
На самом деле, я просто попытался преобразовать 'PI' в BigDecimal и вывести ... ... и получил« 3.142 »в результате, так что это тоже не сработает. ;-) –