Удобное введение
Документация Java по форматированию строк не является самой легкой для чтения и понимания, если вы не знакомы с форматированием строк или просто хотите быстрое решение. Несмотря на то, что он завершен, он не очень удобен для пользователя, поэтому я подумал, что попробую написать более четкую версию. Эта статья для вас так же важна, как и для меня.
Методы форматирования
Есть два метода, которые обеспечивают поведение форматирования String: format () и printf () . Метод format () — это статический метод String.class, а метод printf () — метод статического System.out.class . Они оба ведут себя одинаково и имеют одинаковую подпись.
1
2
|
format( "format string" , argument(s)); printf( "format string" , argument(s)); |
«Строка форматирования» используется для форматирования значений в списке аргументов .
Он может содержать как строковую литеральную информацию, которая не связана с какими-либо аргументами, так и специфические для аргументов данные форматирования. Форматирование данных всегда начинается со знака процента ( % ), за которым следует семантика форматирования.
Давайте посмотрим на некоторые примеры.
Замените заполнитель в строке
Давайте начнем с самого простого примера. В фрагменте кода под заполнителем % s заменяется именем Alex .
1
2
|
String.format( "Hello %s" , "Alex" ); // Hello Alex |
Метод format () возвращает строку, содержащую сообщение Hello Alex .
Несколько заполнителей
Можно заменить более одного заполнителя одновременно. В следующем примере отформатированная строка состоит из строки и примитива с плавающей точкой.
1
2
|
String.format( "The %s costs $%f" , "Bag" , 12 .99f); // The Bag costs $12.990000 |
Обратите внимание, что число не отформатировано как валюта с двумя десятичными числами. Давайте посмотрим на форматирование чисел дальше.
Как отформатировать число
Чтобы отформатировать число до заданного числа десятичных знаков, укажите количество знаков после символа % заполнителя, как показано в следующем фрагменте кода.
1
2
|
String.format( "The %s costs $%.2f" , "Bag" , 12 .99f); // The Bag costs $12.99 |
Добавить разделитель номеров
Чтобы добавить разделитель чисел, добавьте запятую после заполнителя%.
1
2
|
String.format( "The %s costs $%,.2f" , "Car" , 54999 .99f); // The Car costs $54,999.99 |
Запятая зависит от локали, поэтому точка (.) Будет использоваться в регионах, где этот символ используется для группировки номеров.
Давайте кратко рассмотрим другие варианты форматирования чисел.
Заключите отрицательное число в скобки
Используйте символ (, чтобы указать, что отрицательные числа должны быть заключены в круглые скобки.
1
2
|
String.format( "Absolute zero is %(.2f degrees Celsius" , - 273 .15f); // Absolute zero is (273.15) degrees Celsius |
Включить положительный или отрицательный знак
Используйте символ +, чтобы включить положительный или отрицательный знак.
1
2
|
String.format( "Temperature of the Sun %,+d K" , 5778 ); // Temperature of the Sun +5,778 K |
1
2
|
String.format( "Temperature of Jupiter %,+d Celsius" , - 145 ); // Temperature of Jupiter -145 Celsius |
Заполнение числа нулями
Заполнение числа нулями выполняется с флагом 0 и указанием ширины. В коде ниже ширина равна 10.
1
2
|
String.format( "A padded number %010d" , 42 ); // A padded number 0000000042 |
Обратите внимание, что число нулей не в 10, а в ширине числа равно 10 с оставшимся пробелом после числа, заполненного нулями, чтобы сделать цифру 10 длинной.
Оставьте оправдать число
Число может отображаться с выравниванием влево и с заданной шириной.
1
2
|
String.format( "A left-justified number <%-10d>" , 42 ); // A left-justified number <42 > |
Обратите внимание, что количество пробелов слева не 10, но ширина числа равна 10, а оставшийся пробел после числа заполняется пробелом, чтобы сделать количество символов длинным.
Восьмеричные и шестнадцатеричные числа
Существует два варианта форматирования для отображения восьмеричных и шестнадцатеричных чисел: с начальным 0 или 0x или без начальных символов.
1
2
3
4
|
String.format( "An octal number %o" , 100 ); // An octal number 144 String.format( "An octal number %#o" , 100 ); // An octal number 0144 |
1
2
3
4
|
String.format( "An hex number %x" , 100 ); // An hex number 64 String.format( "An hex number %#X" , 100 ); // An hex number 0X64 |
Обратите внимание на заглавную букву X в последнем примере. Регистр X определяет регистр X в выходном номере, то есть строчная буква x приводит к строчной букве X в выходном номере.
Округление номера флага
Чтобы обобщить то, о чем я говорил до сих пор, я подготовил таблицу, обобщающую флаги. Это не исчерпывающий список, поскольку вы должны обратиться к документации по Java .
Флаг | Описание | Заметки |
— | Слева оправдать этот аргумент. | Не может использоваться с пэдом «0». Также необходимо указать ширину. |
+ | Включить знак (+ или -) с этим аргументом | Только с номерами. д или ф. |
0 | Дополните этот аргумент нулями. | Только с номерами. Также необходимо указать ширину. д или ф. |
, | Используйте специфичные для локали разделители группировки (то есть запятую в 123 456) | Только с номерами. д или ф. |
( | Заключите отрицательные числа в скобки | Только с номерами. д или ф. |
Спецификатор формата для общего, символьного и числового типов имеет следующий синтаксис:
Строка формата: % [arg_index $] [flags] [width] [. Precision] символ преобразования
Значения в квадратных скобках [] являются необязательными, единственными обязательными элементами строки формата являются символ процента в процентах и символ преобразования.
Символы преобразования
Чтобы округлить символы преобразования, о которых я говорил, я построил сводную таблицу. Это не исчерпывающий список, поскольку вы должны обратиться к документации по Java .
Конверсионный персонаж | Тип | Заметки |
d | интеграл | Десятичное целое |
о | интеграл | Восьмеричное целое |
х, х | интеграл | Шестнадцатеричное целое |
е, е | плавающая запятая | Десятичное число в научной записи |
е | плавающая запятая | Десятичное число |
т, т | дата / время | Префикс для символов преобразования даты и времени |
% | процент | Буквальный% |
Как отформатировать строку
Строки могут быть отформатированы почти так же, как и для чисел, и будут использовать многие из тех же флагов. Давайте начнем с рассмотрения строки, отформатированной с несколькими аргументами.
Несколько аргументов
Отформатированная строка может содержать несколько аргументов разных типов. В следующем примере есть два аргумента: один — строка, а другой — целое число.
1
2
|
String.format( "The %1s has %2d moons" , "Saturn" , 53 ); // The Saturn has 53 moons |
Обратите внимание на формат аргумента. Число относится к порядку параметров, следующих за строкой. Например,% 1s ссылается на 1-й аргумент, а% 2d ссылается на второй аргумент.
Форматирование строки
Строка может быть подвергнута тому же форматированию, что и числа. Давайте посмотрим несколько быстрых примеров:
Укажите ширину
1
2
|
String.format( "Fun with <%10s>" , "Java" ); // Fun with < Java> |
Укажите левое обоснование с шириной
1
2
|
output = String.format( "Fun with <%-10s>" , "Java" ); // Fun with <Java > |
Усечь максимальное количество символов
1
2
|
output = String.format( "Fun with <%.1s>" , "Java" ); // Fun with <J> |
Заключительные слова
Вот несколько составных примеров, которые объединяют флаги, ширину, точность и символ преобразования.
1
2
|
System. out.printf( "%2$(+,8d, %1$(+,8d" , 1234 , - 5678 ); // (5.678), +1.234 |
- ( показать скобки вокруг отрицательных чисел
- + показать + для положительных чисел
- , используйте местные числовые форматы
- 8 минимальная ширина 8
- D цифры
1
2
|
System. out.printf( "%2$0+,8d, %1$0+,8d" , 1234 , - 5678 ); // -005.678, +001.234 |
- 0 заполнить пробелы 0
1
2
3
|
System. out.printf( "%2$-+,8d, %1$-+,8d" , 1234 ,- 5678 ); // -5.678, +1.234 |
- — Выровняйте влево
1
2
|
System. out.printf( "%1$+,8.4f" , 12234.678878 ); // +12.234,6789 |
- + показать + для положительных чисел
- , используйте местные числовые форматы
- 8 минимальная ширина 8
- .4 количество цифр после точки, округленное
- F плавает
Вывод
Форматирование строк является сложной темой, и чтобы быть уверенным, что вы знаете все подробности, обратитесь к документации Java .
Код источника
Исходный код для этой статьи находится в моем репозитории GitHub .
Дальнейшее чтение
Я обычно публикую сообщения о Java EE . Вот краткий список тем, которые могут вас заинтересовать:
- Java EE: прошлое, настоящее и будущее
- Внедрение контекста и зависимости (CDI)
- Enterprise Java Beans (EJB)
- Что такое аннотации JAX-RS?
- Для чего используется аннотация @Context?
Учить больше
Если вы хотите повысить свой уровень владения Java EE, попробуйте мои видео-курсы Lynda.com. Они охватывают ряд технологий Java EE:
- RESTful Сервис с JAX-RS 2.0
- Программирование WebSocket с помощью Java EE
- Обработка JSON с помощью Java EE и
- Обучение Java Enterprise Edition
Опубликовано на Java Code Geeks с разрешения Алекса Тидома, партнера нашей программы JCG. Смотрите оригинальную статью здесь: Как отформатировать строку, уточнил!
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |