1108

How do you left pad an int with zeros when converting to a String in java?

I'm basically looking to pad out integers up to 9999 with leading zeros (e.g. 1 = 0001).

James Wong
  • 4,014
  • 4
  • 44
  • 61
Omar Kooheji
  • 50,943
  • 65
  • 176
  • 234
  • 2
    Yup, that's it! my bad... I typed it in on my phone. You dont' need the "new String" either : Integer.toString(num+10000).subString(1) works. – Randyaa Sep 23 '14 at 15:10
  • Long.valueOf("00003400").toString(); Integer.valueOf("00003400").toString(); --->3400 – frekele Jul 20 '15 at 22:32
  • 1
    see also http://stackoverflow.com/questions/35521278/printing-an-integer-in-java-that-have-zero-in-front-of-it/35521965#35521965 for a solution with diagram – bvdb Feb 20 '16 at 11:33
  • There is a problem with the `new String(Integer.toString(num + 10000)).substring(1)` approach if `num` is any bigger than 9999 though, ijs. – Felype Jun 23 '16 at 12:43

15 Answers15

1818

Use java.lang.String.format(String,Object...) like this:

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

for zero-padding with a length of 5. For hexadecimal output replace the d with an x as in "%05x".

The full formatting options are documented as part of java.util.Formatter.

Sled
  • 16,514
  • 22
  • 110
  • 148
Yoni Roit
  • 26,694
  • 7
  • 32
  • 32
142

Let's say you want to print 11 as 011

You could use a formatter: "%03d".

enter image description here

You can use this formatter like this:

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

Alternatively, some java methods directly support these formatters:

System.out.printf("%03d", a);
StarCoder
  • 229
  • 3
  • 15
bvdb
  • 15,306
  • 3
  • 82
  • 95
  • 5
    @Omar Koohei indeed, but it explains the reasoning behind the "magic constants". – bvdb Feb 22 '16 at 16:20
  • Nice answer! Just a comment, the `F` of format() should be `f`: `String.format(...);`. – David Miguel Nov 06 '16 at 17:14
  • what if i dont want to append a leading 0 but another letter/number? thanks – chiperortiz Jan 14 '19 at 15:01
  • 1
    @chiperortiz afaik it's not possible with the above formatting tools. In that case, I calculate the required leading characters (e.g. `int prefixLength = requiredTotalLength - String.valueOf(numericValue).length`), and then use a repeat string method to create the required prefix. There are various ways to repeat strings, but there isn't a native java one, afaik: https://stackoverflow.com/questions/1235179/simple-way-to-repeat-a-string-in-java – bvdb Jan 16 '19 at 16:28
120

If you for any reason use pre 1.5 Java then may try with Apache Commons Lang method

org.apache.commons.lang.StringUtils.leftPad(String str, int size, '0')
Dave Newton
  • 152,765
  • 23
  • 240
  • 286
Boris Pavlović
  • 58,387
  • 26
  • 115
  • 142
31

Found this example... Will test...

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));
    }
}

Tested this and:

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

Both work, for my purposes I think String.Format is better and more succinct.

Omar Kooheji
  • 50,943
  • 65
  • 176
  • 234
21

If performance is important in your case you could do it yourself with less overhead compared to the String.format function:

/**
 * @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();       
}

Performance

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

Result

Own function: 1697ms

String.format: 38134ms

das Keks
  • 2,933
  • 3
  • 27
  • 48
  • 1
    Above there's a mention of using DecimalFormat being faster. Did you have any notes on that? – Patrick May 22 '14 at 19:21
  • @Patrick For DecimalFormat performance see also: http://stackoverflow.com/questions/8553672/a-faster-alternative-to-decimalformat-format – Stephan Jun 10 '16 at 10:30
  • Shocking! It's nuts that function works so poorly. I had to zero pad and display a collection of unsigned ints that could range between 1 to 3 digits. It needed to work lightning fast. I used this simple method: `for( int i : data ) strData += (i > 9 ? (i > 99 ? "" : "0") : "00") + Integer.toString( i ) + "|";` That worked very rapidly (sorry I didn't time it!). – BuvinJ Jul 03 '17 at 21:45
  • How does the performance compare after it's been run enough for HotSpot to have a crack at it? – Phil Feb 08 '18 at 19:44
17

You can use Google Guava:

Maven:

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

Sample code:

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

Note:

Guava is very useful library, it also provides lots of features which related to Collections, Caches, Functional idioms, Concurrency, Strings, Primitives, Ranges, IO, Hashing, EventBus, etc

Ref: GuavaExplained

Tho
  • 17,326
  • 6
  • 51
  • 41
  • 1
    Above sample code is usage only, not really sample code. The comment reflect this, you would need "String myPaddedString = Strings.padStart(...)" – JoeG Jul 27 '16 at 11:49
  • 2
    This method actually gives much better performance results than JDK String.format / MessageFormatter / DecimalFormatter. – rafalmag Apr 14 '17 at 11:05
16

Try this one:

import java.text.DecimalFormat; 

DecimalFormat df = new DecimalFormat("0000");

String c = df.format(9);   // Output: 0009

String a = df.format(99);  // Output: 0099

String b = df.format(999); // Output: 0999
Brijesh Patel
  • 268
  • 3
  • 11
6

Here is how you can format your string without using DecimalFormat.

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

09

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

019

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

0119

Morgan Koh
  • 1,257
  • 19
  • 18
3
int x = 1;
System.out.format("%05d",x);

if you want to print the formatted text directly onto the screen.

Shashi
  • 736
  • 9
  • 37
  • 1
    But OP never asked for it. Internally `String.format` and `System.out.format` call the same `java.util.Formatter` implementation. – bsd Aug 24 '13 at 13:40
  • ... and System.out can be redirected. – Phil Feb 08 '18 at 19:44
3

Although many of the above approaches are good, but sometimes we need to format integers as well as floats. We can use this, particularly when we need to pad particular number of zeroes on left as well as right of decimal numbers.

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(",",""));  
 }    
}  
Deepak
  • 57
  • 5
1

You need to use a Formatter, following code uses 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));

Output: 0001

J J
  • 4,698
  • 5
  • 30
  • 48
1

Use the class DecimalFormat, like so:

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

OUTPUT : 0000811

Shomu
  • 1,891
  • 16
  • 31
0

Check my code that will work for integer and String.

Assume our first number is 2. And we want to add zeros to that so the the length of final string will be 4. For that you can use following code

    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);
Fathah Rehman P
  • 7,353
  • 3
  • 36
  • 41
-1

Here is another way to pad an integer with zeros on the left. You can increase the number of zeros as per your convenience. Have added a check to return the same value as is in case of negative number or a value greater than or equals to zeros configured. You can further modify as per your requirement.

/**
 * 
 * @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();
    }
}

Input

0

7

13

713

7013

9999

Output

0000

0007

0013

7013

9999

Dinesh Lomte
  • 387
  • 3
  • 4
-2

No packages needed:

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

This will pad the string to three characters, and it is easy to add a part more for four or five. I know this is not the perfect solution in any way (especially if you want a large padded string), but I like it.

BartoszKP
  • 32,105
  • 13
  • 92
  • 123
NoShadowKick
  • 235
  • 1
  • 3
  • 12