Удобное введение
Документация 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 144String.format("An octal number %#o", 100);// An octal number 0144 |
|
1
2
3
4
|
String.format("An hex number %x", 100);// An hex number 64String.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, являются их собственными. |