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

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

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

21 ответ

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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 лучше и лаконичнее.

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

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

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

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

09

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

019

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

0119

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

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

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

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(",",""));  
 }    
}  
int x = 1;
System.out.format("%05d",x);

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

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

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

ВЫХОД: 0000811

Вам нужно использовать 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

Если вы используете Java 15 и выше,

      var minutes = 5
var strMinutes = "%02d".formatted(minutes)

где 2 — общее количество цифр, которые вы хотите отобразить (включая ноль).

      Output: 05

Это используетformattedчасть метода экземпляра метода для вызываемых строк, который делает то же самое, что и статическийString.format(str,x,y,z)

Вы можете добавить начальный 0 к своей строке следующим образом. Определите строку, которая будет максимальной длиной строки, которую вы хотите. В моем случае мне нужна строка длиной всего 9 символов.

      String d = "602939";
d = "000000000".substring(0, (9-d.length())) + d;
System.out.println(d);

Выход: 000602939

В Котлине вы можете использовать функцию format().

      val minutes = 5
val strMinutes = "%02d".format(minutes)

где 2 — общее количество цифр, которые вы хотите отобразить (включая ноль).

Выход: 05

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

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

Для Котлина

      fun Calendar.getFullDate(): String {
    val mYear = "${this.get(Calendar.YEAR)}-"
    val mMonth = if (this.get(Calendar.MONTH) + 1 < 10) {
        "0${this.get(Calendar.MONTH) + 1}-"
    } else {
        "${this.get(Calendar.MONTH)+ 1}-"
    }
    val mDate = if (this.get(Calendar.DAY_OF_MONTH)  < 10) {
        "0${this.get(Calendar.DAY_OF_MONTH)}"
    } else {
        "${this.get(Calendar.DAY_OF_MONTH)}"
    }
    return mYear + mMonth + mDate
}

и использовать его как

val date: String = calendar.getFullDate()

Используйте эту простую функцию расширения

      fun Int.padZero(): String {
    return if (this < 10) {
        "0$this"
    } else {
        this.toString()
    }
}

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

/**
 * 
 * @author Dinesh.Lomte
 *
 */
public class AddLeadingZerosToNum {
    
    /**
     * 
     * @param args
     */
    public static void main(String[] args) {
        
        System.out.println(getLeadingZerosToNum(0));
        System.out.println(getLeadingZerosToNum(7));
        System.out.println(getLeadingZerosToNum(13));
        System.out.println(getLeadingZerosToNum(713));
        System.out.println(getLeadingZerosToNum(7013));
        System.out.println(getLeadingZerosToNum(9999));
    }
    /**
     * 
     * @param num
     * @return
     */
    private static String getLeadingZerosToNum(int num) {
        // Initializing the string of zeros with required size
        String zeros = new String("0000");
        // Validating if num value is less then zero or if the length of number 
        // is greater then zeros configured to return the num value as is
        if (num < 0 || String.valueOf(num).length() >= zeros.length()) {
            return String.valueOf(num);
        }
        // Returning zeros in case if value is zero.
        if (num == 0) {
            return zeros;
        }
        return new StringBuilder(zeros.substring(0, zeros.length() - 
                String.valueOf(num).length())).append(
                        String.valueOf(num)).toString();
    }
}

Ввод

0

7

13

713

7013

9999

Выход

0000

0007

0013

7013

9999

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

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

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

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

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

Другие вопросы по тегам