如何格式化前导零的Java字符串?


191

例如,这是字符串:

"Apple"

我想加零来填写8个字符:

"000Apple"

我该怎么办?

Answers:


287

如果您必须在没有库帮助的情况下执行此操作:

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

(有效,只要您的字符串不超过8个字符。)


21
那真是太聪明了,但是我花了大约30秒钟才“明白了”。我认为更具可读性的解决方案会更好。
艾米B 2010年

2
当您将软件嵌入没有太多空间的东西上时,这是一个出色的解决方案。谢谢!!
Casey Murray

这个版本快疯了!我喜欢它。
达卡龙2014年

2
老实说,@ Mathu并不难理解。将两个字符串串联(连接在一起),并从中提取前5个字符。没魔术 在这种情况下(对于固定字符串的Apple)不是很明智,但是很容易理解。 ("0000" + theString).substring(theString.length())更现实。这theString用前导零填充。抱歉无法拒绝添加此评论:)
HankCa '16

1
该解决方案语法简短,但并非“疯狂快速”。如果幸运的话,编译器会对其进行优化,但是本质上真正的“快速”方法是使用StringBuilder,并且需要一个循环来填充它。如果确实只要求截断8个字符的字符串是可以的,尽管这是一个非常狭窄的用例,但是这种解决方案永远不能被称为快速解决方案。很短。
Dici

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

14
但我想在字符串之前而不是int加上前导零。
罗伊2010年

1
您可以将StringUtils或DecimalFormat用于Java 1.4及更低版本。在这里检查javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev

3
使用@Variag %07s 代替%07d,您将获得一个FormatFlagsConversionMismatchException。你可以试试。
Z fp

127
 StringUtils.leftPad(yourString, 8, '0');

这是来自commons-lang见javadoc


3
为什么不使用commons-lang?它有很多有用的附加功能。
博佐

7
即使您不能使用commons-lang,也可以轻松地从StringUtils复制源代码以创建自己的函数。这将比所选答案好得多。docjar.com/html/api/org/apache/commons/lang/...
kaliatech

3
如果那是该库使用的唯一方法怎么办?也许添加的库甚至比使用它的应用程序大很多倍。我可以想象有很多原因向应用程序添加公共库。不要误会我的意思:我同意,它包含非常有用的内容,但是我知道如果好处是不需要只编写一个(或几个)方法,就不愿意填充一个充满外部JAR的应用程序。
巴特·基尔斯

2
回答“为什么不使用commons-lang?它有很多有用的附加功能。” 一个具体例子的问题。小米在其Android设备上发布了commons-lang的过时版本。在您的应用程序中包含较新版本会导致类加载器冲突,因此commons-lang不再可以在任何Android项目中使用。
那智(Nachi)2016年

1
@Nachi即使已过时的StringUtils.leftPad应该存在
Lluis Martinez'May

29

我坚信这就是他真正要的:

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

输出:

000Apple

在一般情况下不起作用;如果将“ Apple”替换为长度为8个字符的字符串(在OP的情况下是可能的)DuplicateFormatFlagsException,则将抛出(由于00格式字符串中的)。如果替换长度超过8个字符的字符串,则会抛出一个IllegalFormatFlagsException(由于负数)。
nbrooks '16

您是正确的,那么:String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8); 。现在您将不会有此异常。
Abhinav Puri

只是想添加String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8);是错误的,应该是String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(1,9);

@ user4231709很棒的解决方案!+1
user1697575

25

您可以使用另一个答案中使用的String.format方法来生成字符串0。

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

通过动态调整格式字符串中前导0的数量,可以将其应用于您的问题:

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

它仍然是一个麻烦的解决方案,但具有的优势是您可以使用整数参数指定结果字符串的总长度。



15

您可以使用此:

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

迄今为止最好的答案。Apache Commons StringUtils是一个简单但非常有用的库。
Zoidberg '17

这样节省了很多时间,而且整洁干净。
阿比舍克(Abhishek)

9

我也遇到过类似的情况,并且使用了它。它非常简洁,您不必处理长度或其他库。

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

简单而整洁。字符串格式返回," Apple"因此在将空格替换为零后,它会提供所需的结果。


然后,您可能要先拆分字符串,将以上操作应用于第一个拆分值,然后再连接其余拆分值。
Erdiİzgi'18

6
String input = "Apple";
StringBuffer buf = new StringBuffer(input);

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

String output = buf.toString();


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

1

您可能需要照顾好边缘情况。这是一种通用方法。

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

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

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

尽管此代码段是受欢迎的,并且可以提供一些帮助,但是如果它包含有关如何解决该问题的说明,则将大大改善。否则,您的答案的教育价值将大大降低-请记住,您将来会为读者回答问题,而不仅仅是现在问的人!请编辑您的答案以添加说明,并指出适用的限制和假设。
Toby Speight

1

在Java中:

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

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

在Scala中:

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

您还可以探索Java 8中使用流并进行缩减的一种方法(类似于我使用Scala的方法)。它与所有其他解决方案有点不同,我特别喜欢它。


0

这是快速的&无论长度如何。

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

0

可以更快地使Chris Lercher回答,当String中的大多数都具有8个字符时

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

就我而言,在我的机器上快1/8。


0

这是我用于预填充字符串的简单的无API的“可读脚本”版本。(简单,可读和可调)。

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

0

是否有人尝试过这种纯Java解决方案(没有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");

不幸的是,仅当字符串中没有空格时,此解决方案才有效。


0

如果要使用纯Java编写程序,则可以遵循以下方法,或者有许多String Utils可以帮助您更好地使用更高级的功能。

使用简单的静态方法,可以实现以下目的。

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

您可以使用上述方法 addLeadingText(length, padding text, your text)

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

输出将为000Apple


-3

它不漂亮,但是可以用。如果您有访问Apache Commons的权限,我建议您使用

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

2
-1可能是因为这不是一个很好的例子:您使用的是“幻数”,并且正在连接字符串,应该使用StringBuilder或StringBuffer替换它们。
巴特·基尔斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.