Avatar ·

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

Всем привет! Я новичок в Java и столкнулся с задачей, которая, казалось бы, простая, но никак не могу найти правильное решение. Мне нужно вывести целое число, например, 42, но так, чтобы оно всегда занимало, скажем, 5 символов, а недостающие позиции слева заполнялись нулями. То есть я хочу получить "00042". Пробовал использовать String.format(), но не совсем понимаю, как правильно задать спецификатор. Пытался написать что-то вроде `String.format("%5d", 42)`, но это добавляет пробелы слева, а не нули. Получается " 42". Также пробовал DecimalFormat, но там какой-то синтаксис с масками, и я запутался. Вот пример моего кода: ```java int number = 42; String padded = String.format("%5d", number); System.out.println(padded); // Выводит " 42", а нужно "00042" ``` Подскажите, пожалуйста, как правильно дополнить число нулями слева? Нужно именно для вывода на экран или записи в файл с фиксированной шириной поля. Буду благодарен за подробное объяснение с примерами. <<>>

Использование 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;
}

Этот подход особенно полезен, если вы пишете код без сторонних библиотек и хотите избежать синтаксиса форматирования, который может показаться сложным новичкам.