Статьи

Как отформатировать строку, уточнил!

Удобное введение

Документация 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, попробуйте мои видео-курсы Lynda.com. Они охватывают ряд технологий Java EE:

Опубликовано на Java Code Geeks с разрешения Алекса Тидома, партнера нашей программы JCG. Смотрите оригинальную статью здесь: Как отформатировать строку, уточнил!

Мнения, высказанные участниками Java Code Geeks, являются их собственными.