Як я можу прокласти ціле число з нулями зліва?


1022

Як ви залишили колодку intз нулями під час переходу на Stringjava?

Я в основному шукаю, щоб замінити цілі числа до 9999провідних нулів (наприклад, 1 = 0001).


2
Так, це все! мені погано ... Я набрав це на своєму телефоні. Вам не потрібна "нова струна": Integer.toString (num + 10000) .subString (1) працює.
Рандяа

Long.valueOf ("00003400"). ToString (); Integer.valueOf ("00003400"). ToString (); ---> 3400
фрекеле

1
дивіться також stackoverflow.com/questions/35521278/… про рішення з діаграмою
bvdb

Існує проблема з new String(Integer.toString(num + 10000)).substring(1)підходом, якщо numвін більший, ніж 9999, ijs.
Феліпе

Відповіді:


1694

Використовуйте 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
Хеліо Соарес, молодший,

115

Скажімо, ви хочете друкувати 11як011

Ви можете використовувати форматчік : "%03d".

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

Ви можете використовувати цей форматер так:

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

Крім того, деякі методи Java безпосередньо підтримують ці формати:

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

5
@Omar 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 Java, то можете спробувати метод 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), оскільки мій номер був Double
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 мс

String.format: 38134ms


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і т.д.

Посилання: GuavaПояснено


1
Вище зразковий код - це лише використання, а не дійсний зразок коду. Коментар відображає це, вам знадобиться "String myPaddedString = Strings.padStart (...)"
JoeG

2
Цей метод насправді дає набагато кращі результати роботи, ніж JDK String.format / MessageFormatter / DecimalFormatter.
rafalmag

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

Перевірте мій код, який буде працювати для цілого і 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);

(new char[diff])чому
Ісаак

replace("\0", "0")що таке ... що
Ісаак

@Isaac - Спочатку я створив масив char та за допомогою цього масиву char створив рядок. Тоді я замінив нульовий символ (що є типовим значенням типу char) на "0" (що є
знаком,

0

Вам потрібно використовувати Форматтер , наступний код використовує 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
Єдина проблема? Спробуйте з numberwidth
мінусом

2
Гарна думка. І я здогадуюсь, це робить більше, ніж вимагали, оскільки він скорочується на ширині (чого явно не просили, але зазвичай потрібні). Прикро, що Java (болісно повільний у порівнянні) String.format () не підтримує змінну ширину і зовсім не підтримує точність для цілих специфікаторів.
johncurrier

-3

Пакети не потрібні:

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

Це накладе рядок на три символи, і легко додати частину більше на чотири-п’ять. Я знаю, що це не ідеальне рішення в будь-якому випадку (особливо, якщо ви хочете велику прокладену струну), але мені це подобається.


1
Хм ... мені це подобається.
Kartik Chugh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.