Avatar ·

Как добавить ведущие нули к целому числу в Java?

Всем привет! Я начинающий Java-разработчик и столкнулся с такой задачей: мне нужно вывести число с ведущими нулями слева, чтобы оно всегда занимало определённое количество символов. Например, число 5 должно превратиться в "0005", а 123 — в "0123" (чтобы длина строки была 4 символа).

Я пробовал использовать конкатенацию строк и циклы, но это выглядит ужасно и неудобно. Вот мой текущий код:

int number = 5;
String result = "";
if (number < 10) {
    result = "000" + number;
} else if (number < 100) {
    result = "00" + number;
} else if (number < 1000) {
    result = "0" + number;
} else {
    result = String.valueOf(number);
}
System.out.println(result); // Выводит "0005"

Этот код работает только для чисел до 9999 и выглядит очень громоздким. А если мне нужно разное количество цифр или я не знаю заранее максимальную длину? Я слышал про String.format() и DecimalFormat, но не понимаю, как их правильно применить. Подскажите, как сделать это красиво и универсально?

Заранее спасибо за помощь!

<<>>

Использование String.format() для добавления ведущих нулей

Самый простой и рекомендуемый способ в Java — использовать метод String.format() или System.out.printf(). Эти методы работают на основе спецификаторов форматирования, которые позволяют задать минимальную ширину поля и символ-заполнитель.

Базовый синтаксис

Для целых чисел используется спецификатор %d. Чтобы добавить ведущие нули, укажите ширину поля и символ '0' после знака процента:

int number = 5;
String formatted = String.format("%04d", number);
System.out.println(formatted); // Вывод: 0005

Здесь %04d означает:

  • % — начало спецификатора
  • 0 — заполнять пустое место нулями
  • 4 — минимальная ширина поля (строка будет не короче 4 символов)
  • d — целое десятичное число

Примеры с разными числами

System.out.println(String.format("%04d", 5));    // 0005
System.out.println(String.format("%04d", 123));  // 0123
System.out.println(String.format("%04d", 9999)); // 9999
System.out.println(String.format("%04d", 12345)); // 12345 (ширина 5 > 4, поэтому без изменений)

Динамическая ширина

Если ширина заранее неизвестна, её можно передать как аргумент:

int number = 42;
int width = 6;
String formatted = String.format("%0" + width + "d", number);
System.out.println(formatted); // Вывод: 000042

Альтернатива: System.out.printf()

Если нужно сразу вывести на консоль, используйте printf:

System.out.printf("%04d%n", 7); // Вывод: 0007 (с переводом строки)

Использование DecimalFormat

Класс java.text.DecimalFormat тоже подходит для этой задачи, особенно если нужно форматировать числа с плавающей точкой:

import java.text.DecimalFormat;

DecimalFormat df = new DecimalFormat("0000");
System.out.println(df.format(5));   // 0005
System.out.println(df.format(123)); // 0123

Шаблон "0000" означает: всегда 4 цифры, недостающие заполняются нулями слева. Если число длиннее 4 цифр, шаблон автоматически расширяется.

Сравнение подходов

  • String.format() — гибкий, интуитивный, поддерживает динамическую ширину. Лучший выбор для большинства случаев.
  • DecimalFormat — удобен для чисел с десятичной частью (например, "0000.00"), но менее нагляден для простого дополнения нулями.
  • Ручная конкатенация (как в вашем примере) — не рекомендуется: код громоздкий, легко допустить ошибку при изменении ширины.

Важные замечания

  • Методы работают только с положительными числами. Для отрицательных чисел знак минус будет в начале, а нули — после него (например, String.format("%04d", -5) вернёт "-005").
  • Если число превышает заданную ширину, оно выводится полностью (без обрезания).
  • Для работы с числами в других системах счисления используйте %x (16-ричная), %o (8-ричная) и т.д.

Таким образом, ваш код можно заменить одной строкой:

String result = String.format("%04d", number);
<<>>

Использование Apache Commons Lang (StringUtils.leftPad)

Если вы используете библиотеку Apache Commons Lang (что часто бывает в крупных проектах), задача решается ещё проще — с помощью метода StringUtils.leftPad():

import org.apache.commons.lang3.StringUtils;

int number = 5;
String result = StringUtils.leftPad(String.valueOf(number), 4, '0');
System.out.println(result); // Вывод: 0005

Преимущества этого подхода:

  • Очень читаемый код — сразу понятно, что мы добавляем символы слева.
  • Гибкость: можно указать любой символ-заполнитель (не только ноль).
  • Автоматически обрабатывает числа любой длины.

Дополнение: ручной способ с StringBuilder

Если по каким-то причинам вы не хотите использовать сторонние библиотеки, но и String.format() кажется неочевидным, можно написать простой утилитарный метод:

public static String padWithZeros(int number, int length) {
    StringBuilder sb = new StringBuilder();
    String numStr = String.valueOf(number);
    int zerosToAdd = length - numStr.length();
    for (int i = 0; i < zerosToAdd; i++) {
        sb.append('0');
    }
    sb.append(numStr);
    return sb.toString();
}

// Использование:
System.out.println(padWithZeros(5, 4)); // 0005

Этот метод даёт полный контроль над процессом и не требует импорта дополнительных библиотек. Однако для production-кода всё же предпочтительнее String.format() или StringUtils — они проверены временем и работают быстрее.