Spec-Zone .ru
спецификации, руководства, описания, API
След: Интернационализация
Урок: Форматирование
Раздел: Числа и Валюты
Настройка Форматов
Домашняя страница > Интернационализация > Форматирование

Настройка Форматов

Можно использовать DecimalFormat class, чтобы отформатировать десятичные числа в специфичные для локали строки. Этот class позволяет Вам управлять дисплеем начальных и конечных нулей, префиксов и суффиксов, группируя (тысячи) разделителей, и десятичного разделителя. Если Вы хотите изменить символы форматирования, такие как десятичный разделитель, можно использовать DecimalFormatSymbols в соединении с DecimalFormat class. Эти классы предлагают большую гибкость в форматировании чисел, но они могут сделать Ваш код более сложным.

Текст, который следует примерам использования, которые демонстрируют DecimalFormat и DecimalFormatSymbols классы. Примеры кода в этом материале из вызванного примера программы DecimalFormatDemo.

Построение Образцов

Вы определяете свойства форматирования DecimalFormat с образцом String. Образец определяет то, на что похоже отформатированное число. Для полного описания синтаксиса образца см. Синтаксис Образца Числового формата.

Пример, который следует, создает средство форматирования, передавая образец String к DecimalFormat конструктор. format метод принимает a double оцените как параметр и возвраты отформатированное число в a String:

DecimalFormat myFormatter = new DecimalFormat(pattern);
String output = myFormatter.format(value);
System.out.println(value + " " + pattern + " " + output);

Вывод для предыдущих строк кода описывается в следующей таблице. value число, a double , это должно быть отформатировано. pattern String это определяет свойства форматирования. output, который является a String, представляет отформатированное число.

Вывод от DecimalFormatDemo Программа
value pattern output Объяснение
123456.789 ###,###.### 123,456.789 Знак фунта (#) обозначает цифру, запятая является заполнителем для группирующегося разделителя, и период является заполнителем для десятичного разделителя.
123456.789 ###.## 123456.79 value имеет три цифры направо от десятичной точки, но pattern имеет только два. format метод обрабатывает это, окружая.
123.78 000000.000 000123.780 pattern определяет начальные и конечные нули, потому что 0 символов используются вместо знака фунта (#).
12345.67 $###,###.### $12,345.67 Первый символ в pattern знак доллара ($). Отметьте, что это сразу предшествует крайней левой цифре в отформатированном output.
12345.67 \u00A5###,###.### ¥12,345.67 pattern определяет, что валюта расписывается за Японскую иену (¥) с 00A5 значения Unicode.

Чувствительное к локали Форматирование

Предыдущий пример создаваемый a DecimalFormat объект для значения по умолчанию Locale. Если Вы хотите a DecimalFormat объект для не по умолчанию Locale, Вы инстанцируете a NumberFormat и затем бросок это к DecimalFormat. Вот пример:

NumberFormat nf = NumberFormat.getNumberInstance(loc);
DecimalFormat df = (DecimalFormat)nf;
df.applyPattern(pattern);
String output = df.format(value);
System.out.println(pattern + " " + output + " " + loc.toString());

Выполнение предыдущего примера кода приводит к выводу, который следует. Отформатированное число, которое находится во втором столбце, меняется Locale:

###,###.###      123,456.789     en_US
###,###.###      123.456,789     de_DE
###,###.###      123 456,789     fr_FR

До сих пор образцы форматирования, обсужденные здесь, следуют за соглашениями американского английского языка. Например, в образце ###,###.## запятая является тысячами разделителя, и период представляет десятичную точку. Это соглашение прекрасно, при условии, что Ваши конечные пользователи не представляются ему. Однако, некоторые приложения, такие как электронные таблицы и генераторы отчетов, позволяют конечным пользователям определять свои собственные образцы форматирования. Для этих приложений образцы форматирования, определенные конечными пользователями, должны использовать локализованную нотацию. В этих случаях Вы будете хотеть вызвать applyLocalizedPattern метод на DecimalFormat объект.

Изменение Символов Форматирования

Можно использовать DecimalFormatSymbols class, чтобы изменить символы, которые появляются в отформатированных числах, произведенных format метод. Эти символы включают десятичный разделитель, группирующийся разделитель, знак "минус", и знак процента, среди других.

Следующий пример демонстрирует DecimalFormatSymbols class, применяя странный формат к числу. Необычный формат является результатом звонков setDecimalSeparator, setGroupingSeparator, и setGroupingSize методы.

DecimalFormatSymbols unusualSymbols = new DecimalFormatSymbols(currentLocale);
unusualSymbols.setDecimalSeparator('|');
unusualSymbols.setGroupingSeparator('^');

String strange = "#,##0.###";
DecimalFormat weirdFormatter = new DecimalFormat(strange, unusualSymbols);
weirdFormatter.setGroupingSize(4);

String bizarre = weirdFormatter.format(12345.678);
System.out.println(bizarre);

Когда выполнено, этот пример печатает число в причудливом формате:

1^2345|678

Синтаксис Образца Числового формата

Можно разработать свои собственные образцы формата для чисел следующим правила, определенные следующей схемой BNF:

pattern    := subpattern{;subpattern}
subpattern := {prefix}integer{.fraction}{suffix}
prefix     := '\\u0000'..'\\uFFFD' - specialCharacters
suffix     := '\\u0000'..'\\uFFFD' - specialCharacters
integer    := '#'* '0'* '0'
fraction   := '0'* '#'*

Нотация, используемая в предыдущей схеме, объясняется в следующей таблице:

Нотация Описание
X* 0 или больше экземпляров X
(X | Y) или X или Y
X..Y любой символ от X до Y, включительно
S - T символы в S, кроме тех в T
{X} X является дополнительным

В предыдущей схеме BNF первый подобразец определяет формат для положительных чисел. Второй подобразец, который является дополнительным, определяет формат для отрицательных чисел.

Хотя не отмеченный в схеме BNF, запятая может появиться в пределах целочисленной части.

В пределах подобразцов Вы определяете форматирование со специальными символами. Эти символы описываются в следующей таблице:

Символ Описание
0 цифра
# цифра, нуль показывает как отсутствующий
. заполнитель для десятичного разделителя
, заполнитель для того, чтобы сгруппировать разделитель
E разделяет мантиссу и экспоненту для экспоненциальных форматов
; разделяет форматы
- значение по умолчанию отрицательный префикс
% умножьтесь на 100 и шоу как процент
? умножьтесь на 1000 и покажите согласно mille
¤ знак валюты; замененный обозначением денежной единицы; если удвоено, замененный международным обозначением денежной единицы; если существующий в образце, денежно-кредитный десятичный разделитель используется вместо десятичного разделителя
X любые другие символы могут использоваться в префиксе или суффиксе
' используемый, чтобы заключить специальные символы в кавычки в префиксе или суффиксе

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Используя Предопределенные Форматы
Следующая страница: Даты и Времена