Есть ли лучший способ получить такой результат? Эта функция не работает, если в 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();
}
Конечно. В то время я согласился с предложением Элайджи, потому что мой проект был привязан к Java 1.4, но я не думаю, что стоит направлять 100 тысяч других пользователей в заблуждение, чтобы у меня получилось работать.
Я проголосовал за закрытие как дубликат. Хотя этот вопрос был задан первым, я думаю, что дубликат немного понятнее для чтения и кажется каноническим вопросом (на основе голосов за и количества просмотров).
@ Дункан, почему вы отметили вопрос шестилетней давности как повторяющийся?
@AngelKoh Я объяснил почему в своем комментарии.




String.format (https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html#syntax)
В вашем случае это будет:
String formatted = String.format("%03d", num);
Если количество цифр является переменным (например, предоставляется в качестве аргумента), приведенный выше метод, хотя и элегантный, может не подходить.
Santhosh ... Просто динамически сделайте строку формата String.format("%0" + paddingSize + "d", num)
@Fran, кроме GWT, я полагаю
Хотел указать, что это решение может быть ошибочным: оно дает разные результаты в зависимости от локали по умолчанию, потому что String.format является LOCALE-SPECIFIC. Есть много языков, в которых НЕ используются арабские цифры 0-9 (как ни странно, арабский язык является одним из таких языков). У меня была ошибка, из-за которой мой код вылетал на Android, когда телефон был настроен на арабский язык, потому что я форматировал строку даты с помощью String.format ("% 04d-% 02d-% 02d", год, месяц, день), думая, что будет выдавать дату ISO 8601, но выдает что-то вроде «٢٠١٤-٠٨-٠٦», когда телефон находится на арабском языке.
@adevine, вы можете избежать этой ошибки, указав нужный локальный адрес, например: Local.US, для арабских пользователей так удобно использовать арабские цифры, просто позвоните String.format(Local.US, string, params)
String formatted = String.format((Locale) null, "%05d", yourLongNumber); также должен работать и безопаснее для некоторых языков ...
вау, старики действительно помогли ...
Начиная с 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 Он устанавливает правильную ширину. Это то же самое, что и ответ Бергая, за исключением того, что отступы добавляются программно с использованием того же интерфейса. Вы просто взглянули на строку формата и решили, что она неверна, не глядя, что на самом деле делает код?
Кажется излишним использовать String.format() дважды, просто используйте конкатенацию строк: String.format("%0" + digits + "d", num)
Если Java 1.4 и ниже, попробуйте новый DecimalFormat ("00000"). Format (123); как показано здесь javadevnotes.com/java-integer-to-string-with-leading-zeros
Другой вариант - использовать 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, пропущен один ноль
Если ваша версия 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: Это решение чрезмерно сложное и не расширяемое.
Это усложняет и избыточность значений.
Как насчет только:
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 длиной 'цифры'
«(1) Это будет возвращать 0num0num0num и т. д. Вместо 00000num» - Вы ошиблись с этим комментарием ... num не входит в цикл.
@ Нэппи, ты прав, не уверен, почему я не видел его тогда.
Вы должны изменить принятый ответ на @begray. Его намного лучше для подавляющего большинства приложений, и для изменяемого количества нулей вы можете использовать
String.format("%0" + digits + "d", num);.