Как дополнить целое число ведущими нулями слева в Java?
Использование String.format() с флагом 0
Самое простое и распространённое решение — использовать метод String.format() или System.out.printf() с флагом 0 для заполнения нулями слева. В спецификаторе формата после знака процента нужно указать флаг 0, затем ширину поля, а затем тип данных d (для целых чисел).
int number = 42;
String padded = String.format("%05d", number);
System.out.println(padded); // Выводит "00042"
Разберём строку формата "%05d":
%— начало спецификатора формата.0— флаг, указывающий, что пустые места слева нужно заполнять нулями (по умолчанию заполняется пробелами).5— минимальная ширина поля. Если число короче 5 символов, оно будет дополнено нулями слева. Если число длиннее, ширина автоматически увеличится.d— тип данных: десятичное целое число (int, long и т.д.).
Использование DecimalFormat
Другой популярный способ — класс DecimalFormat из пакета java.text. Он позволяет задать шаблон с нулями:
import java.text.DecimalFormat;
int number = 42;
DecimalFormat df = new DecimalFormat("00000");
String padded = df.format(number);
System.out.println(padded); // "00042"
Шаблон "00000" означает, что число должно занимать ровно 5 позиций. Если число короче, слева добавляются нули. Если длиннее, шаблон автоматически расширяется (например, число 123456 превратится в "123456", а не обрежется).
Использование StringUtils из Apache Commons Lang
Если вы используете библиотеку Apache Commons Lang, можно воспользоваться утилитой StringUtils:
import org.apache.commons.lang3.StringUtils;
int number = 42;
String padded = StringUtils.leftPad(String.valueOf(number), 5, '0');
System.out.println(padded); // "00042"
Метод leftPad() принимает строку, целевую длину и символ-заполнитель. Этот способ удобен, если вы уже используете библиотеку в проекте.
Ручной способ с StringBuilder
Если по каким-то причинам вы хотите сделать всё вручную без сторонних библиотек и сложного форматирования:
int number = 42;
int width = 5;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < width - String.valueOf(number).length(); i++) {
sb.append('0');
}
sb.append(number);
String padded = sb.toString();
System.out.println(padded); // "00042"
Этот подход даёт полный контроль над процессом, но менее элегантен и более подвержен ошибкам (например, если число длиннее заданной ширины, код сломается).
Важные моменты
- Отрицательные числа: флаг
0работает корректно с отрицательными числами — знак минус выводится первым, а нули идут после него. Например,String.format("%05d", -42)вернёт"-0042". - Ширина поля: если число длиннее указанной ширины, оно выводится полностью без обрезания. Например,
String.format("%05d", 123456)вернёт"123456". - Производительность:
String.format()иDecimalFormatнемного медленнее ручного способа, но для большинства приложений это не критично.
Рекомендую использовать String.format() как самый простой и читаемый вариант для большинства задач.
Альтернативный подход: StringBuilder с циклическим добавлением нулей
Если вы не хотите использовать String.format() или DecimalFormat (например, в учебных целях или для лучшего понимания происходящего), можно написать простой метод-утилиту:
public static String padWithZeros(int number, int totalLength) {
String numStr = Integer.toString(number);
if (numStr.length() >= totalLength) {
return numStr;
}
StringBuilder sb = new StringBuilder();
int zerosToAdd = totalLength - numStr.length();
for (int i = 0; i < zerosToAdd; i++) {
sb.append('0');
}
sb.append(numStr);
return sb.toString();
}
// Пример использования:
System.out.println(padWithZeros(42, 5)); // "00042"
System.out.println(padWithZeros(123, 3)); // "123"
System.out.println(padWithZeros(7, 2)); // "07"
Этот метод явно показывает логику: вычислить, сколько нулей нужно добавить, и сформировать строку. Он легко модифицируется, например, для работы с отрицательными числами (знак минус нужно обрабатывать отдельно).
Также можно использовать String.repeat() (доступно с Java 11) для более лаконичного кода:
public static String padWithZerosJava11(int number, int totalLength) {
String numStr = Integer.toString(number);
if (numStr.length() >= totalLength) {
return numStr;
}
return "0".repeat(totalLength - numStr.length()) + numStr;
}
Этот подход особенно полезен, если вы пишете код без сторонних библиотек и хотите избежать синтаксиса форматирования, который может показаться сложным новичкам.
Ответов пока нет.
Войдите чтобы оставить ответ