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

Есть ли лучший способ получить такой результат? Эта функция не работает, если в num больше цифр, чем цифр, и я чувствую, что он должен быть где-то в библиотеке (например, Integer.toString (x, "% 3d") или что-то в этом роде)

static String intToString(int num, int digits) {
    StringBuffer s = new StringBuffer(digits);
    int zeroes = digits - (int) (Math.log(num) / Math.log(10)) - 1; 
    for (int i = 0; i < zeroes; i++) {
        s.append(0);
    }
    return s.append(num).toString();
}

Вы должны изменить принятый ответ на @begray. Его намного лучше для подавляющего большинства приложений, и для изменяемого количества нулей вы можете использовать String.format("%0" + digits + "d", num);.

t.pimentel 01.09.2014 17:59

Конечно. В то время я согласился с предложением Элайджи, потому что мой проект был привязан к Java 1.4, но я не думаю, что стоит направлять 100 тысяч других пользователей в заблуждение, чтобы у меня получилось работать.

Nate Parsons 17.09.2014 04:08

Я проголосовал за закрытие как дубликат. Хотя этот вопрос был задан первым, я думаю, что дубликат немного понятнее для чтения и кажется каноническим вопросом (на основе голосов за и количества просмотров).

Duncan Jones 23.09.2014 12:24

@ Дункан, почему вы отметили вопрос шестилетней давности как повторяющийся?

Angel Koh 19.06.2015 11:03

@AngelKoh Я объяснил почему в своем комментарии.

Duncan Jones 19.06.2015 11:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
519
5
532 278
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

String.format (https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html#syntax)

В вашем случае это будет:

String formatted = String.format("%03d", num);
  • 0 - заполнить нулями
  • 3 - установить ширину на 3

Если количество цифр является переменным (например, предоставляется в качестве аргумента), приведенный выше метод, хотя и элегантный, может не подходить.

Santosh Tiwari 13.02.2013 20:43

Santhosh ... Просто динамически сделайте строку формата String.format("%0" + paddingSize + "d", num)

mlathe 22.03.2013 03:41

@Fran, кроме GWT, я полагаю

Andrey Regentov 03.02.2014 12:31

Хотел указать, что это решение может быть ошибочным: оно дает разные результаты в зависимости от локали по умолчанию, потому что String.format является LOCALE-SPECIFIC. Есть много языков, в которых НЕ используются арабские цифры 0-9 (как ни странно, арабский язык является одним из таких языков). У меня была ошибка, из-за которой мой код вылетал на Android, когда телефон был настроен на арабский язык, потому что я форматировал строку даты с помощью String.format ("% 04d-% 02d-% 02d", год, месяц, день), думая, что будет выдавать дату ISO 8601, но выдает что-то вроде «٢٠١٤-٠٨-٠٦», когда телефон находится на арабском языке.

adevine 10.05.2014 01:15

@adevine, вы можете избежать этой ошибки, указав нужный локальный адрес, например: Local.US, для арабских пользователей так удобно использовать арабские цифры, просто позвоните String.format(Local.US, string, params)

Walid Ammar 31.07.2014 18:03
String formatted = String.format((Locale) null, "%05d", yourLongNumber); также должен работать и безопаснее для некоторых языков ...
StefanTo 22.09.2016 14:35

вау, старики действительно помогли ...

ArifMustafa 28.06.2018 05:30

Начиная с Java 1.5 вы можете использовать метод String.format. Например, чтобы сделать то же самое, что и в вашем примере:

String format = String.format("%0%d", digits);
String result = String.format(format, num);
return result;

В этом случае вы создаете строку формата, используя ширину, указанную в цифрах, а затем применяете ее непосредственно к числу. Формат этого примера преобразуется следующим образом:

%% --> %
0  --> 0
%d --> <value of digits>
d  --> d

Таким образом, если цифры равны 5, форматная строка становится %05d, которая указывает целое число шириной 5 печатающих ведущих нулей. См. документы Java для String.format для получения дополнительной информации о спецификаторах преобразования.

См. Ответ begray, в котором используются правильные флаги для обнуления вывода шириной 3 символа.

Robert 05.09.2012 23:47

@Robert Он устанавливает правильную ширину. Это то же самое, что и ответ Бергая, за исключением того, что отступы добавляются программно с использованием того же интерфейса. Вы просто взглянули на строку формата и решили, что она неверна, не глядя, что на самом деле делает код?

Jason Coco 06.09.2012 01:17

Кажется излишним использовать String.format() дважды, просто используйте конкатенацию строк: String.format("%0" + digits + "d", num)

icza 21.08.2014 16:22

Если Java 1.4 и ниже, попробуйте новый DecimalFormat ("00000"). Format (123); как показано здесь javadevnotes.com/java-integer-to-string-with-leading-zeros

JavaDev 05.03.2015 06:37

Другой вариант - использовать DecimalFormat для форматирования вашей числовой строки. Вот еще один способ выполнить работу без использования String.format, если вы застряли в мире до 1.5:

static String intToString(int num, int digits) {
    assert digits > 0 : "Invalid number of digits";

    // create variable length array of zeros
    char[] zeros = new char[digits];
    Arrays.fill(zeros, '0');
    // format number as String
    DecimalFormat df = new DecimalFormat(String.valueOf(zeros));

    return df.format(num);
}

Не работает при num = 0, пропущен один ноль

Quentin Golsteyn 02.07.2014 13:29

Если ваша версия jdk меньше 1.5, можно использовать следующую опцию.

    int iTest = 2;
    StringBuffer sTest = new StringBuffer("000000"); //if the string size is 6
    sTest.append(String.valueOf(iTest));
    System.out.println(sTest.substring(sTest.length()-6, sTest.length()));

-1: Это решение чрезмерно сложное и не расширяемое.

Max Beikirch 18.07.2013 15:15

Это усложняет и избыточность значений.

neo7 24.11.2016 03:56

Как насчет только:

public static String intToString(int num, int digits) {
    String output = Integer.toString(num);
    while (output.length() < digits) output = "0" + output;
    return output;
}

(1) Это вернет 0num0num0num и т. д. Вместо 00000num (2) Большое количество конкатенаций строк с "+" - плохая идея с точки зрения производительности. Лучше предварительно выделить StringBuffer или StringBuilder длиной 'цифры'

Nate Parsons 29.03.2011 19:58

«(1) Это будет возвращать 0num0num0num и т. д. Вместо 00000num» - Вы ошиблись с этим комментарием ... num не входит в цикл.

Nappy 11.07.2011 14:26

@ Нэппи, ты прав, не уверен, почему я не видел его тогда.

Nate Parsons 13.08.2012 05:57

Другие вопросы по теме