Java добавляя "0" в конце числа
Таким образом, моя проблема была такова, что я должен был вычислить 10^n так, чтобы n ~ 10^5. Очевидно, что он не подходит ни для какого типа данных, поэтому я решил использовать вместо него строку. Наконец, я нашел решение в книге для начинающих https://beginnersbook.com/2014/07/java-right-padding-a-string-with-spaces-and-zeros/.
Я не хочу BigInteger
решение умножения 10 н раз.
public class PadRightExample2 {
public static void main(String[] argv) {
System.out.println("#" + rightPadZeros("mystring", 10) + "@");
System.out.println("#" + rightPadZeros("mystring", 15) + "@");
System.out.println("#" + rightPadZeros("mystring", 20) + "@");
}
public static String rightPadZeros(String str, int num) {
return String.format("%1$-" + num + "s", str).replace(' ', '0');
}
}
Выход:
#mystring00@
#mystring0000000@
#mystring000000000000@
Кто-нибудь может объяснить, что такое %1$-
и что s
используется для?
2 ответа
%
обозначает формат строки1$
означает первый дополнительный параметрargs
изString.format(String format, Object... args)
,2$
будет вторым, и т.д..-
это левое обоснование, в связи с номером объявляется длина итогового вывода, кратко сказано. Документация по java.util.Formatter объясняет немного лучше:Слева оправдывает вывод. Пробелы ('\u0020') будут добавлены в конце преобразованного значения, как требуется для заполнения минимальной ширины поля.
s
обозначает тип параметра String
Типичным примером является регистрация, где вы анализируете аргументы с %s
что практически то же самое. С символом доллара и номером %1$s
вы указываете номер аргумента и -10
делает конечную длину вывода 10.
#mystring00@ // mystring00 has length 10
#mystring0000000@ // mystring0000000 has length 15
#mystring000000000000@ // #mystring000000000000 has length 20
Большая часть информации может быть найдена в документации java.util.Formatter, которая используется в String::format
,
Фрагмент, который вы нашли, может быть немного запутанным, потому что он работает даже без 1$
потому что аргументы передаются по порядку.
Попробуйте следующее: String.format("%2$-" + num + "s", str, "test").replace(' ', '0');
, Результат будет
#test000000@
#test00000000000@
#test0000000000000000@
В то время как String.format("%1$-" + num + "s", str, "test").replace(' ', '0');
приводит к исходному результату из вашего фрагмента. Обратите внимание на 1$
а также 2$
разница.
Может быть, я не правильно понимаю вопрос, но не могу:
public static String rightPadZeros(String str, int num) {
String add = "";
for(int i = 0; i < num;i++) add += "0";
return str + add;
}
Я не совсем понимаю, почему вы хотите, чтобы два ноля, когда num=10
, но если вы хотите этого, сделайте:
public static String rightPadZeros(String str, int num) {
String add = "";
for(int i = 0; i < num - 8;i++) add += "0";
return str + add;
}
РЕДАКТИРОВАТЬ: очевидно, это было плохо для производительности, так что это может быть лучше:
public static String rightPadZeros(String str, int num) {
return str + new String(new char[num]).replace("\0", "0");
}