用零填充字符串的左侧

288
我见过类似的问题这里这里
但我不知道如何在字符串左侧填充零。
输入:"129018" 输出:"0000129018"
输出的总长度应该是10。
20个回答

418

如果您的字符串仅包含数字,您可以将其转换为整数,然后进行填充:

String.format("%010d", Integer.parseInt(mystring));

如果不行,我想知道如何实现


2
因为没有看到我需要执行Integer.parseInt(),所以我一直在抓狂。 - JRSofty
9
另外,对于那些想要使用其他不是“0”的内容填充其数字/字符串的人,请将“%0”更改为“%yourchoice”。 - micnguyen
4
提醒一下:这个解决方案对于大的整数值(例如:"9999999999")无效;因此我选择使用Oliver Michels的解决方案,使用Apache commons库。 - oneworld
8
对于像"9999999999"这样的大整数值,String.format()支持使用BigInteger,方法是:String.format("%010d", new BigInteger("9999999999")) - real_paul
4
你确定吗?百分号后面的“0”是一个标记。可能的标记非常有限。 - Gustavo

164
String paddedString = org.apache.commons.lang.StringUtils.leftPad("129018", 10, "0")
第二个参数是期望的输出长度。 "0" 是填充字符。

26
提醒一下……String是不可变的(参见 *String is immutable. What exactly is the meaning?*),因此StringUtils.leftPad(variable, 10, "0");不会改变variable的值。您需要将结果赋值给它,像这样:variable = StringUtils.leftPad(variable, 10, "0"); - falsarella
能够在不运行命令的情况下查看建议命令的输出将是很好的。听说过一个好的程序员是一个懒惰的程序员 :) 无论如何,这里是代码示例:StringUtils.leftPad("1", 3, '0') -> "001"。 - AlikElzin-kilaka
另一个提醒 - 如果要填充的值的长度大于所需填充的指定长度,则返回原始字符串,即不截断。[来源] (https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#leftPad-java.lang.String-int-char-) - hello_earth

122
这将使任何字符串向左填充到总宽度为10,无需担心解析错误:
String unpadded = "12345"; 
String padded = "##########".substring(unpadded.length()) + unpadded;

//unpadded is "12345"
//padded   is "#####12345"

如果您想要向右填充:
String unpadded = "12345"; 
String padded = unpadded + "##########".substring(unpadded.length());

//unpadded is "12345"
//padded   is "12345#####"  

你可以用任何字符替换"#",重复使用这个字符的次数来填充字符串,使其达到所需的总宽度。例如,如果你想在左侧添加零,使整个字符串长度为15个字符:
String unpadded = "12345"; 
String padded = "000000000000000".substring(unpadded.length()) + unpadded;

//unpadded is "12345"
//padded   is "000000000012345"  

与khachik的答案相比,这种方法的好处是它不使用Integer.parseInt,因为它可能会抛出异常(例如,如果您要填充的数字太大,如12147483647)。缺点是,如果您要填充的是一个int,那么您必须将其转换为字符串,然后再转回来,这是不可取的。
因此,如果您确定它是int,khachik的答案非常有效。如果不确定,则这是一种可能的策略。

7
需要注意要填充的字符串长度,调用substring()可能会抛出IndexOutOfBoundsException异常。 - Hitman
1
加上性能呢?我认为它会创建3个不同的字符串,如果我没记错的话。 - Aditya Peshave
4
为什么这个帖子会被点赞?它与JavaScript有关,而不是Java。 - mhvelplund
2
@mhvelplund,这篇文章在3月2日被Rick编辑过,我认为他只是犯了一个错误,我已经撤销了更改。 - Magnus
谢谢@Magnus,那绝对是个错误。 - Rick Hanlon II
太好了!它帮助了我。 - andrefilipeos

58
String str = "129018";
String str2 = String.format("%10s", str).replace(' ', '0');
System.out.println(str2);

2
这种方法比被接受的答案更加迂回。 - Paul W
3
@PaulW:但对于字符串来说它是有效的。 - Janus Troelsen
9
如果字符串中有空格,这种方法就行不通了... - JKillian

55
String str = "129018";
StringBuilder sb = new StringBuilder();

for (int toPrepend=10-str.length(); toPrepend>0; toPrepend--) {
    sb.append('0');
}

sb.append(str);
String result = sb.toString();

8
将英语翻译成中文。仅返回翻译的文本:+1 是唯一没有使用外部库的正确答案。 - Joeri Hendrickx
只需观察StringBuilder的缓冲区大小,其默认值为16,对于大格式大小,请正确设置缓冲区大小,例如: StringBuilder sb = new StringBuilder(); - Welington Veiga

27

FYI,链接已失效。 - stkent

16

要格式化字符串,请使用

import org.apache.commons.lang.StringUtils;

public class test {

    public static void main(String[] args) {

        String result = StringUtils.leftPad("wrwer", 10, "0");
        System.out.println("The String : " + result);

    }
}

输出:字符串:“00000wrwer”

第一个参数是要格式化的字符串,第二个参数是期望输出长度,第三个参数是用于填充字符串的字符。

使用此链接下载jar文件:http://commons.apache.org/proper/commons-lang/download_lang.cgi


10

如果你需要高性能,并且知道字符串的最大尺寸,请使用以下代码:

String zeroPad = "0000000000000000";
String str0 = zeroPad.substring(str.length()) + str;

请注意最大字符串大小。如果它比StringBuffer的大小要大,您将会得到一个java.lang.StringIndexOutOfBoundsException。


1
这很好用。幸运的是,我正在处理二进制数字,所以我知道最大值将为8。谢谢。 - frostymarvelous
这一点也不优雅。每次想要填充时,都必须创建一个变量。 - luizfzs

7
一个古老的问题,但我也有两种方法。
对于固定(预定义)长度:
    public static String fill(String text) {
        if (text.length() >= 10)
            return text;
        else
            return "0000000000".substring(text.length()) + text;
    }

对于可变长度的变量:
    public static String fill(String text, int size) {
        StringBuilder builder = new StringBuilder(text);
        while (builder.length() < size) {
            builder.append('0');
        }
        return builder.toString();
    }

7
我更喜欢这段代码:

public final class StrMgr {

    public static String rightPad(String input, int length, String fill){                   
        String pad = input.trim() + String.format("%"+length+"s", "").replace(" ", fill);
        return pad.substring(0, length);              
    }       

    public static String leftPad(String input, int length, String fill){            
        String pad = String.format("%"+length+"s", "").replace(" ", fill) + input.trim();
        return pad.substring(pad.length() - length, pad.length());
    }
}

然后:

System.out.println(StrMgr.leftPad("hello", 20, "x")); 
System.out.println(StrMgr.rightPad("hello", 20, "x"));

1
我认为你把左右搞混了。StrMgr.leftPad是在字符串后面添加填充,而StrMgr.rightPad是在前面添加。至少对我来说,我希望左填充将填充添加到字符串的前面。 - PassKit
是的,你说得对!现在已经修复了!感谢@Passkit。 - strobering

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接