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

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);
bvdb
источник
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

Shomu
источник
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

JoBⅈN
источник
-2
public static String zeroPad(long number, int width) {
   long wrapAt = (long)Math.pow(10, width);
   return String.valueOf(number % wrapAt + wrapAt).substring(1);
}

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

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

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

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

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

NoShadowKick
источник
1
Хм ... мне это нравится.
Картик Чуг