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

907

Как вы оставили pad с int с нулями при преобразовании в String в java?

Я в основном пытаюсь выставить целые числа до 9999 с ведущими нулями (например, 1 = 0001).

  • 1
    Да это все! мой плохой ... я набрал его на своем телефоне. Вам также не нужна "новая строка": Integer.toString (num + 10000) .subString (1) работает.
  • 0
    . ( "00003400") ToString Long.valueOf (); . ( "00003400") ToString Integer.valueOf (); ---> 3400
Показать ещё 2 комментария
Теги:
formatting

14 ответов

1493
Лучший ответ

Используйте java.lang.String.format(String,Object...) следующим образом:

String.format("%05d", yournumber);

для нулевого заполнения с длиной 5. Для шестнадцатеричного вывода замените d на x, как в "%05x".

Полные параметры форматирования документируются как часть java.util.Formatter.

  • 118
    Дополнительный совет: замените d на топор ("% 05x") на шестнадцатеричное
  • 1
    Стоит ли ожидать, что параметры в String.format будут похожи на printf () в C?
Показать ещё 9 комментариев
98

Если вы по какой-либо причине используете pre 1.5 Java, тогда можете попробовать с помощью метода Apache Commons Lang

org.apache.commons.lang.StringUtils.leftPad(String str, int size, '0')
65

Скажем, вы хотите напечатать 11 как 011

Вы можете использовать форматтер: "%03d".

Изображение 1378

Вы можете использовать этот форматировщик следующим образом:

int a = 11;
String with3digits = String.format("%03d", a);
System.out.println(with3digits);

Кроме того, некоторые java-методы напрямую поддерживают эти форматирования:

System.out.printf("%03d", a);
  • 4
    @ Омар Кохэй действительно, но это объясняет причину "магических констант".
  • 0
    Хороший ответ! Просто комментарий, F формата () должен быть f : String.format(...); ,
Показать ещё 5 комментариев
27

Нашел этот пример... Будет ли тест...

import java.text.DecimalFormat;
class TestingAndQualityAssuranceDepartment
{
    public static void main(String [] args)
    {
        int x=1;
        DecimalFormat df = new DecimalFormat("00");
        System.out.println(df.format(x));
    }
}

Протестировано и:

String.format("%05d",number);

Обе работают, для моих целей я считаю, что String.Format лучше и более лаконично.

  • 1
    Да, я собирался предложить DecimalFormat, потому что я не знал о String.format, но потом увидел ответ Ужина. String.format должен быть новым.
  • 0
    Это похоже на то, как вы делаете это в .Net, за исключением того, что .Net выглядит лучше для небольших чисел.
Показать ещё 2 комментария
15

Вы можете использовать Google Guava:

Maven:

<dependency>
     <artifactId>guava</artifactId>
     <groupId>com.google.guava</groupId>
     <version>14.0.1</version>
</dependency>

Пример кода:

String paddedString1 = Strings.padStart("7", 3, '0'); //"007"
String paddedString2 = Strings.padStart("2020", 3, '0'); //"2020"

Примечание:

Guava - очень полезная библиотека, она также предоставляет множество функций, связанных с Collections, Caches, Functional idioms, Concurrency, Strings, Primitives, Ranges, IO, Hashing, EventBus и т.д.

Ссылка: GuavaExplained

  • 1
    Выше пример кода только для использования, а не пример кода. Комментарий отражает это, вам может понадобиться «String myPaddedString = Strings.padStart (...)»
  • 2
    Этот метод на самом деле дает гораздо лучшие результаты производительности, чем JDK String.format / MessageFormatter / DecimalFormatter.
15

Если производительность важна в вашем случае, вы можете сделать это самостоятельно с меньшими накладными расходами по сравнению с функцией String.format:

/**
 * @param in The integer value
 * @param fill The number of digits to fill
 * @return The given value left padded with the given number of digits
 */
public static String lPadZero(int in, int fill){

    boolean negative = false;
    int value, len = 0;

    if(in >= 0){
        value = in;
    } else {
        negative = true;
        value = - in;
        in = - in;
        len ++;
    }

    if(value == 0){
        len = 1;
    } else{         
        for(; value != 0; len ++){
            value /= 10;
        }
    }

    StringBuilder sb = new StringBuilder();

    if(negative){
        sb.append('-');
    }

    for(int i = fill; i > len; i--){
        sb.append('0');
    }

    sb.append(in);

    return sb.toString();       
}

Производительность

public static void main(String[] args) {
    Random rdm;
    long start; 

    // Using own function
    rdm = new Random(0);
    start = System.nanoTime();

    for(int i = 10000000; i != 0; i--){
        lPadZero(rdm.nextInt(20000) - 10000, 4);
    }
    System.out.println("Own function: " + ((System.nanoTime() - start) / 1000000) + "ms");

    // Using String.format
    rdm = new Random(0);        
    start = System.nanoTime();

    for(int i = 10000000; i != 0; i--){
        String.format("%04d", rdm.nextInt(20000) - 10000);
    }
    System.out.println("String.format: " + ((System.nanoTime() - start) / 1000000) + "ms");
}

Результат

Собственная функция: 1697мс

String.format: 38134ms

  • 1
    Выше упомянуто, что использование DecimalFormat быстрее. У вас были какие-нибудь заметки по этому поводу?
  • 0
    @Patrick Для производительности DecimalFormat см. Также: stackoverflow.com/questions/8553672/…
Показать ещё 2 комментария
2

Попробуй это:

DecimalFormat df = new DecimalFormat("0000");
String c = df.format(9);   // 0009
String a = df.format(99);  // 0099
String b = df.format(999); // 0999
2
int x = 1;
System.out.format("%05d",x);

если вы хотите напечатать форматированный текст непосредственно на экране.

  • 1
    Но ОП никогда не просила об этом. Внутренне String.format и System.out.format вызывают String.format и ту же реализацию java.util.Formatter .
  • 0
    ... и System.out может быть перенаправлен.
2

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

import java.text.NumberFormat;  
public class NumberFormatMain {  

public static void main(String[] args) {  
    int intNumber = 25;  
    float floatNumber = 25.546f;  
    NumberFormat format=NumberFormat.getInstance();  
    format.setMaximumIntegerDigits(6);  
    format.setMaximumFractionDigits(6);  
    format.setMinimumFractionDigits(6);  
    format.setMinimumIntegerDigits(6);  

    System.out.println("Formatted Integer : "+format.format(intNumber).replace(",",""));  
    System.out.println("Formatted Float   : "+format.format(floatNumber).replace(",",""));  
 }    
}  
0

Используйте класс DecimalFormat, например:

NumberFormat formatter = new DecimalFormat("0000"); //i use 4 Zero but you can also another number
System.out.println("OUTPUT : "+formatter.format(811)); 

ВЫХОД: 0000811

0

Вам нужно использовать Formatter, следующий код использует NumberFormat

    int inputNo = 1;
    NumberFormat nf = NumberFormat.getInstance();
    nf.setMaximumIntegerDigits(4);
    nf.setMinimumIntegerDigits(4);
    nf.setGroupingUsed(false);

    System.out.println("Formatted Integer : " + nf.format(inputNo));

Выход: 0001

0

Проверьте мой код, который будет работать для integer и String.

Предположим, что наше первое число равно 2. И мы хотим добавить к нему нули, так что длина окончательной строки будет равна 4. Для этого вы можете использовать следующий код

    int number=2;
    int requiredLengthAfterPadding=4;
    String resultString=Integer.toString(number);
    int inputStringLengh=resultString.length();
    int diff=requiredLengthAfterPadding-inputStringLengh;
    if(inputStringLengh<requiredLengthAfterPadding)
    {
        resultString=new String(new char[diff]).replace("\0", "0")+number;
    }        
    System.out.println(resultString);
  • 0
    (new char[diff]) почему
  • 0
    replace("\0", "0") что ... что
Показать ещё 1 комментарий
-2
public static String zeroPad(long number, int width) {
   long wrapAt = (long)Math.pow(10, width);
   return String.valueOf(number % wrapAt + wrapAt).substring(1);
}

Единственная проблема с этим подходом заключается в том, что он заставляет вас задуматься о том, как это работает.

  • 4
    Единственная проблема? Попробуйте это с отрицательным number или с width больше 18.
  • 2
    Хорошая точка зрения. И я предполагаю, что он делает больше, чем было запрошено, так как он усекается по ширине (о чем явно не просили, но обычно требуется). Жаль, что Java (мучительно медленный по сравнению) String.format () не поддерживает переменную ширину и совсем не поддерживает точность для целочисленных спецификаторов.
-4

Не требуется пакетов:

String paddedString = i < 100 ? i < 10 ? "00" + i : "0" + i : "" + i;

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

  • 1
    Хм ... мне это нравится.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню