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");
}
Другие вопросы по тегам