Что такое шаблон MessageFormat для создания локализованного вывода с полной точностью для любого двойного - PullRequest
0 голосов
/ 19 декабря 2018

Учитывая пример кода:

String format = "{0,number}"; // <- What do I put here?
double value = Math.PI * 1e-10;
System.out.println(value);
System.out.println(new MessageFormat(format, Locale.US).format(new Object[]{value}));
System.out.println(new MessageFormat(format, Locale.FRANCE).format(new Object[]{value}));

Что я использую в качестве строки формата, чтобы я получал вывод с полной точностью любого двойного значения и чтобы вывод был локализован?Например, вывод текущего кода:

3.1415926535897934E-10
0
0

String.valueOf(double) правильно печатает с полной точностью, но это не формат сообщения и он не локализован.Формат сообщения решает, что значение слишком мало, чтобы беспокоиться.Для больших чисел результаты еще хуже!MessageFormat печатает 16 значащих цифр, а затем добавляет группу нулей, которые не точно отражают значение, хранящееся в двойном числе.Например, с pi * 1e100 я получаю:

3.141592653589793E100
31,415,926,535,897,930,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000
31 415 926 535 897 930 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000

1 Ответ

0 голосов
/ 19 декабря 2018

Для вашего требования и только для него это самое простое решение, которое соответствует вашему коду.

Используя символ # ниже, мы показываем цифры только тогда, когда они не равны 0, в противном случае они пропускаются.

double value = Math.PI*1e-10;
        String format = "{0,number,#.###############E0}"; // <- What do I put here?

        System.out.println(value);
        System.out.println(new MessageFormat(format, Locale.US).format(new Double[]{value}));
        System.out.println(new MessageFormat(format, Locale.FRANCE).format(new Double[]{value}));

Если вы хотите опустить преобразование форматирования чисел с использованием научногоуведомления, например, вместо 9.424777960769379E2 (если в формате #. ############### E0) или 94.24777960769379E1 (если в формате ##. ############### E0), чтобы быть 942.4777960769379, просто используйте код ниже:

        double value = Math.PI*1e-10;
        String format = "{0,number,#.################}"; // <- What do I put here?

Посмотрите, и если есть что-то, что вам нужно дополнительно, не стесняйтесь спрашивать!

...