265

Here is the String, for example:

"Apple"

and I would like to add zero to fill in 8 chars:

"000Apple"

How can I do so?

0

24 Answers 24

409
public class LeadingZerosExample {
    public static void main(String[] args) {
       int number = 1500;

       // String format below will add leading zeros (the %0 syntax) 
       // to the number above. 
       // The length of the formatted string will be 7 characters.

       String formatted = String.format("%07d", number);

       System.out.println("Number with leading zeros: " + formatted);
    }
}
Sign up to request clarification or add additional context in comments.

4 Comments

but I would like to adding leading zero before a string instead of an int.
You can use StringUtils or DecimalFormat for Java 1.4 and below. Check here javadevnotes.com/java-integer-to-string-with-leading-zeros
@Variag use %07s instead of %07d, you will get a FormatFlagsConversionMismatchException. you can try it.
Weird! int number = "Apple"; didn't work! How odd? 🤔
336

In case you have to do it without the help of a library:

("00000000" + "Apple").substring("Apple".length())

(Works, as long as your String isn't longer than 8 chars.)

10 Comments

That's pretty clever -- but it took me about 30 seconds to "get it". I think a more readable solution would be better.
This is an -excellent- solution when you are embedding software on something without much space and the extra libraries just aren't an option. Thanks!!
This version is crazy fast! I love it.
@Mathu honestly that is not difficult to understand. Two strings are concatenated (joined together) and the first 5 characters are extracted from it. No magic. Not very sensible in this case (for fixed string Apple) but easy to understand. ("0000" + theString).substring(theString.length()) is more realistic. This pads theString with leading zeros. Sorry couldn't resist adding this comment :)
This solution has a short syntax but it's not "crazy fast". If you're lucky the compiler will optimize it but essentially the real "fast" way to do this is using a StringBuilder, and it takes a loop to fill it. If the requirement is really to only truncate 8-characters strings that's ok, although that's a very narrow use-case, but this solution can never be called fast. It is just short.
|
176
 StringUtils.leftPad(yourString, 8, '0');

This is from commons-lang. See javadoc

8 Comments

Why not use commons-lang? It has a loot of useful extras.
Even if you are not able to use commons-lang, you can easily copy the source from StringUtils to make your own function. That would be a much better general solution than the selected answer. docjar.com/html/api/org/apache/commons/lang/…
what if that would be the only method the library is used for? Perhaps the added library is even many times bigger than the app it is used in. I can imagine quite some reasons not to add a commons library in an application. Don't get me wrong: I agree, it contains very useful stuff, but I understand the reluctance to stuff an app full of external JARs if the benefit is not needing to write just one (or a couple) of methods.
@kaliatech: yes, a much better GENERAL solution, but if he don't want to use the library probably a focused (short) solution is more appropriate.
To answer the "Why not use commons-lang? It has a loot of useful extras." question with a concrete example. Xiaomi ships an outdated version of commons-lang on its Android devices. Including a newer version in your app leads to classloader conflicts, so commons-lang can no longer be used in any Android project.
|
42

This is what he was really asking for I believe:

String.format("%0"+ (8 - "Apple".length() )+"d%s",0 ,"Apple"); 

output:

000Apple

4 Comments

Doesn't work for the general case; if you substitute "Apple" with a string of length 8 characters (which is possible in OP's case) this throws a DuplicateFormatFlagsException (because of the 00 in the format string). If you substitute a string longer than 8 characters, this throws an IllegalFormatFlagsException (because of the negative number).
You are right, but what about this then : String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8); . Now you wont have this exception.
Just wanna add String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8); is WRONG, it should be String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(1,9); .
@user4231709 Great solution! +1
31

You can use the String.format method as used in another answer to generate a string of 0's,

String.format("%0"+length+"d",0)

This can be applied to your problem by dynamically adjusting the number of leading 0's in a format string:

public String leadingZeros(String s, int length) {
     if (s.length() >= length) return s;
     else return String.format("%0" + (length-s.length()) + "d%s", 0, s);
}

It's still a messy solution, but has the advantage that you can specify the total length of the resulting string using an integer argument.

Comments

17

You can use this:

org.apache.commons.lang.StringUtils.leftPad("Apple", 8, "0")

2 Comments

By far the best answer. Apache commons StringUtils is a simple yet extremely helpful library.
This saved a lot of time and it's neat and clean as well.
16

Using Guava's Strings utility class:

Strings.padStart("Apple", 8, '0');

Comments

14

I've been in a similar situation and I used this; It is quite concise and you don't have to deal with length or another library.

String str = String.format("%8s","Apple");
str = str.replace(' ','0');

Simple and neat. String format returns " Apple" so after replacing space with zeros, it gives the desired result.

3 Comments

Then you may want to split the string first, apply the operation above to the first split value, than concatenate the rest of the split values.
if "Apple" had spaces in it, the spaces would be replaced with 0s.
this can be shortened to String str = String.format("%8s","Apple").replace(' ', '0');
6
String input = "Apple";
StringBuffer buf = new StringBuffer(input);

while (buf.length() < 8) {
  buf.insert(0, '0');
}

String output = buf.toString();

Comments

5

Use Apache Commons StringUtils.leftPad (or look at the code to make your own function).

Copied Source:

    /**
     * Left pad a String with a specified String.
     *
     * <p>Pad to a size of {@code size}.</p>
     *
     * <pre>
     * StringUtils.leftPad(null, *, *)      = null
     * StringUtils.leftPad("", 3, "z")      = "zzz"
     * StringUtils.leftPad("bat", 3, "yz")  = "bat"
     * StringUtils.leftPad("bat", 5, "yz")  = "yzbat"
     * StringUtils.leftPad("bat", 8, "yz")  = "yzyzybat"
     * StringUtils.leftPad("bat", 1, "yz")  = "bat"
     * StringUtils.leftPad("bat", -1, "yz") = "bat"
     * StringUtils.leftPad("bat", 5, null)  = "  bat"
     * StringUtils.leftPad("bat", 5, "")    = "  bat"
     * </pre>
     *
     * @param str  the String to pad out, may be null
     * @param size  the size to pad to
     * @param padStr  the String to pad with, null or empty treated as single space
     * @return left padded String or original String if no padding is necessary,
     *  {@code null} if null String input
     */
    public static String leftPad(final String str, final int size, String padStr) {
        if (str == null) {
            return null;
        }
        if (isEmpty(padStr)) {
            padStr = SPACE;
        }
        final int padLen = padStr.length();
        final int strLen = str.length();
        final int pads = size - strLen;
        if (pads <= 0) {
            return str; // returns original String when possible
        }
        if (padLen == 1 && pads <= PAD_LIMIT) {
            return leftPad(str, size, padStr.charAt(0));
        }

        if (pads == padLen) {
            return padStr.concat(str);
        }
        if (pads < padLen) {
            return padStr.substring(0, pads).concat(str);
        }
        final char[] padding = new char[pads];
        final char[] padChars = padStr.toCharArray();
        for (int i = 0; i < pads; i++) {
            padding[i] = padChars[i % padLen];
        }
        return new String(padding).concat(str);
    }

Comments

3

Solution with method String::repeat (Java 11)

String str = "Apple";
String formatted = "0".repeat(8 - str.length()) + str;

If needed change 8 to another number or parameterize it

Comments

3

You can use:

String.format("%08d", "Apple");

It seems to be the simplest method and there is no need of any external library.

4 Comments

String.format("%08d", anInteger); // this worked for me. String version throws exception
This won't run.
Agree with @Heiner, formatting String with number format will fail.
I am getting errors as well.
3

I like the solution from Pad a String with Zeros

String.format("%1$" + length + "s", inputString).replace(' ', '0');

with length = "8" and inputString = "Apple"

Comments

2

In Java:

String zeroes="00000000";
String apple="apple";

String result=zeroes.substring(apple.length(),zeroes.length())+apple;

In Scala:

"Apple".foldLeft("00000000"){(ac,e)=>ac.tail+e}

You can also explore a way in Java 8 to do it using streams and reduce (similar to the way I did it with Scala). It's a bit different to all the other solutions and I particularly like it a lot.

Comments

1
public class PaddingLeft {
    public static void main(String[] args) {
        String input = "Apple";
        String result = "00000000" + input;
        int length = result.length();
        result = result.substring(length - 8, length);
        System.out.println(result);
    }
}

Comments

1

You may have to take care of edgecase. This is a generic method.

public class Test {
    public static void main(String[] args){
        System.out.println(padCharacter("0",8,"hello"));
    }
    public static String padCharacter(String c, int num, String str){
        for(int i=0;i<=num-str.length()+1;i++){str = c+str;}
        return str;
    }
}

Comments

1
public static void main(String[] args)
{
    String stringForTest = "Apple";
    int requiredLengthAfterPadding = 8;
    int inputStringLengh = stringForTest.length();
    int diff = requiredLengthAfterPadding - inputStringLengh;
    if (inputStringLengh < requiredLengthAfterPadding)
    {
        stringForTest = new String(new char[diff]).replace("\0", "0")+ stringForTest;
    }
    System.out.println(stringForTest);
}

Comments

1
public static String lpad(String str, int requiredLength, char padChar) {
    if (str.length() > requiredLength) {
        return str;
    } else {
        return new String(new char[requiredLength - str.length()]).replace('\0', padChar) + str;
    }
}

1 Comment

Whilst this code snippet is welcome, and may provide some help, it would be greatly improved if it included an explanation of how it addresses the question. Without that, your answer has much less educational value - remember that you are answering the question for readers in the future, not just the person asking now! Please edit your answer to add explanation, and give an indication of what limitations and assumptions apply.
1

Did anyone tried this pure Java solution (without SpringUtils):

//decimal to hex string 1=> 01, 10=>0A,..
String.format("%1$2s", Integer.toString(1,16) ).replace(" ","0");
//reply to original question, string with leading zeros. 
//first generates a 10 char long string with leading spaces, and then spaces are
//replaced by a zero string. 
String.format("%1$10s", "mystring" ).replace(" ","0");

Unfortunately this solution works only if you do not have blank spaces in a string.

Comments

0

This is fast & works for whatever length.

public static String prefixZeros(String value, int len) {
    char[] t = new char[len];
    int l = value.length();
    int k = len-l;
    for(int i=0;i<k;i++) { t[i]='0'; }
    value.getChars(0, l, t, k);
    return new String(t);
}

Comments

0

Can be faster then Chris Lercher answer when most of in String have exacly 8 char

int length = in.length();
return length == 8 ? in : ("00000000" + in).substring(length);

in my case on my machine 1/8 faster.

Comments

0

Here is the simple API-less "readable script" version I use for pre-padding a string. (Simple, Readable, and Adjustable).

while(str.length() < desired_length)
  str = '0'+str;

Comments

0

If you want to write the program in pure Java you can follow the below method or there are many String Utils to help you better with more advanced features.

Using a simple static method you can achieve this as below.

public static String addLeadingText(int length, String pad, String value) {
    String text = value;
    for (int x = 0; x < length - value.length(); x++) text = pad + text;
    return text;
}

You can use the above method addLeadingText(length, padding text, your text)

addLeadingText(8, "0", "Apple");

The output would be 000Apple

Comments

-3

It isn't pretty, but it works. If you have access apache commons i would suggest that use that

if (val.length() < 8) {
  for (int i = 0; i < val - 8; i++) {
    val = "0" + val;
  }
}

2 Comments

The -1 is probably because this is a not so good example: you're using "magic numbers" and are concatenating Strings, something that should be replaced by using a StringBuilder or StringBuffer.
This is not a good answer due to val - 8 isn't correct logic for the Java and will cause compile error

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.