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


1022

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

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


2
Да это все! мой плохой ... я набрал его на своем телефоне. Вам также не нужна "новая строка": Integer.toString (num + 10000) .subString (1) работает.
Рандя

. Long.valueOf ( "00003400") ToString (); . Integer.valueOf ( "00003400") ToString (); ---> 3400
Frekele

1
см. также stackoverflow.com/questions/35521278/… для решения с диаграммой
bvdb

Существует проблема с new String(Integer.toString(num + 10000)).substring(1)подходом, если numон больше 9999, хотя, ijs.
Felype

Ответы:


1697

Используйте java.lang.String.format(String,Object...)как это:

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

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

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


1
Должен ли я ожидать, что параметры String.formatбудут похожи на printf () в C?
Эхтеш Чоудхури

13
Если вам нужно сделать это для большого списка значений, производительность DecimalFormat как минимум в 3 раза выше, чем String.format (). Я сам выполняю некоторые настройки производительности и запускаю их в Visual VM, где метод String.format () накапливает процессорное время примерно в 3-4 раза быстрее, чем DecimalFormat.format ().
Стив Фергюсон

10
И чтобы добавить более 9 нулей, используйте что-то вроде%012d
Мухаммед Банисаид

2
Это для Java 5 и выше. Для версии 1.4 и ниже DecimalFormat является альтернативой, как показано здесь javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev

1
Привет, народ! У меня есть некоторые проблемы с использованием:%d can't format java.lang.String arguments
Helio Soares Junior

116

Допустим, вы хотите напечатать 11как011

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

введите описание изображения здесь

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

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

В качестве альтернативы, некоторые методы Java напрямую поддерживают эти форматеры:

System.out.printf("%03d", a);

5
@ Омар Koohei действительно, но это объясняет причину "магических констант".
bvdb

Хороший ответ! Просто комментарий, то Fформат () должен быть f: String.format(...);.
Дэвид Мигель

Что делать, если я не хочу добавлять начальный 0, но другую букву / цифру? спасибо
chiperortiz

1
@chiperortiz afaik это невозможно с помощью вышеуказанных инструментов форматирования. В этом случае я вычисляю требуемые начальные символы (например int prefixLength = requiredTotalLength - String.valueOf(numericValue).length), а затем использую метод повторяющихся строк для создания требуемого префикса. Существуют различные способы повторения строк, но не существует нативного Java, afaik: stackoverflow.com/questions/1235179/…
bvdb

114

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

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

29

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

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 должен быть новым.
Пол Томблин

Это похоже на то, как вы делаете это в .Net, за исключением того, что .Net выглядит лучше для небольших чисел.
Омар Кохеджи

В моем случае я использовал первый вариант (DecimalFormat) , потому что мой номер был двухместный
mauronet

21

Если производительность важна в вашем случае, вы можете сделать это самостоятельно с меньшими издержками по сравнению с 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мс

Строка.формат: 38134мс


1
Выше есть упоминание о том, что DecimalFormat работает быстрее. У вас были какие-нибудь заметки по этому поводу?
Патрик

@Patrick Для производительности DecimalFormat см. Также: stackoverflow.com/questions/8553672/…
Стефан

Возмутительно! Орехи, что функция работает так плохо. Мне пришлось обнулить блок и отобразить коллекцию неподписанных целых, которые могли бы быть в диапазоне от 1 до 3 цифр. Нужно было работать молниеносно. Я использовал этот простой метод: он for( int i : data ) strData += (i > 9 ? (i > 99 ? "" : "0") : "00") + Integer.toString( i ) + "|";работал очень быстро (извините, я не успел!).
BuvinJ

Как сравнивается производительность после того, как HotSpot был запущен настолько, что на нем есть трещина?
Фил

16

Вы можете использовать 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 (...)»
JoeG

2
Этот метод на самом деле дает гораздо лучшие результаты производительности, чем JDK String.format / MessageFormatter / DecimalFormatter.
Рафалмаг

10

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

import java.text.DecimalFormat; 

DecimalFormat df = new DecimalFormat("0000");
String c = df.format(9);   // 0009
String a = df.format(99);  // 0099
String b = df.format(999); // 0999

3

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

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(",",""));  
 }    
}  

2
int x = 1;
System.out.format("%05d",x);

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


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

... и System.out может быть перенаправлен.
Фил

1

Используйте класс DecimalFormat, вот так:

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

ВЫХОД: 0000811


1

Вот как вы можете отформатировать вашу строку без использования DecimalFormat.

String.format("%02d", 9)

09

String.format("%03d", 19)

019

String.format("%04d", 119)

0119


0

Проверьте мой код, который будет работать для целых чисел и строк.

Предположим, что наше первое число равно 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);

(new char[diff])почему
Исаак

replace("\0", "0")что ... что
Исаак

@Isaac - Сначала я создал массив символов и, используя этот массив символов, создал строку. Затем я заменил нулевой символ (который является значением по умолчанию типа char) на «0» (который является
символом,

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


-2
public static String zeroPad(long number, int width) {
   long wrapAt = (long)Math.pow(10, width);
   return String.valueOf(number % wrapAt + wrapAt).substring(1);
}

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


5
Единственная проблема? Попробуйте с отрицательным numberили widthбольше 18.
user85421

2
Хорошая точка зрения. И я предполагаю, что он делает больше, чем было запрошено, так как он усекается по ширине (о чем явно не просили, но обычно требуется). Жаль, что Java (мучительно медленный по сравнению) String.format () не поддерживает переменную ширину и совсем не поддерживает точность целочисленных спецификаторов.
Johncurrier

-3

Пакеты не нужны:

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

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


1
Хм ... мне это нравится.
Картик Чуг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.