Как заставить DecimalFormat отображать строки ASCII вместо специальных символов? - PullRequest
3 голосов
/ 19 декабря 2011

Играя с double форматированием строки, я заметил, что, по крайней мере, в моей локали строки, созданные по умолчанию DecimalFormat, отличаются от тех, которые генерируются Double.toString() когда дело доходит до особых случаев, таких как Infinity и NaN.Например, из этого фрагмента:

for (double i : new double[]{ 1/0.0, -1/0.0, 0/0.0 }) {
    System.out.println(Double.toString(i));
    System.out.println(new DecimalFormat().format(i));
}

Я получаю следующий вывод:

Infinity
∞
-Infinity
-∞
NaN
�

Это не только вызывает проблемы с существующим кодом, который следит за NaN и Infinity, нопоследний символ не читается шрифтами в моей системе разработки.Насколько я могу судить, проверив его числовое значение, этот последний символ является U+FFFD заменяющим символом Unicode, что, вероятно, означает, что он на самом деле не был установлен на что-то значимое.

Так как для некоторых моих приложенийЯ предпочитаю 7-битные представления ASCII ( «Будьте либеральны в том, что вы принимаете, будьте консервативны в том, что вы производите» ), есть ли способ заставить строки, генерируемые DecimalFormat, соответствовать тем, которые генерируетDouble.toString()?

Одним из способов может быть предоставление моего собственного DecimalFormatSymbols, но мне кажется, что мне придется самостоятельно устанавливать все связанные поля, что звучит несколько хрупко.Есть ли способ избежать этого?

1 Ответ

2 голосов
/ 21 декабря 2011

К сожалению, единственный способ изменить это, используя класс DecimalFormatSymbols.

http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html

вы можете получить объект DecimalFormatSymbols из вашего DecimalFormat и изменить его. см. фрагмент кода ниже. Таким образом, вам не нужно устанавливать все поля.

DecimalFormat df = new DecimalFormat();
DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
dfs.setNaN("NaN");
df.setDecimalFormatSymbols(dfs);
...