在Java中,将零左填充到字符串变量

11

我有一个10位数的字符串变量,如果长度小于10,我需要在变量前面添加'0'。例如,如果字符串为9909909,则应返回0009909909。如何在Java中实现?


http://java.sun.com/developer/technicalArticles/Programming/sprintf/ - Marc B
1
String.format("%010d", Integer.parseInt(mystring)); 使用该代码可以将字符串转换为整数,并在前面添加零,使其总长度为10个字符。 - Melih Altıntaş
11个回答

13
你可以使用StringUtilsleftPad函数。
所以,它会像这样:
StringUtils.leftPad(myString, 10,"0");

leftpad 是否存在无法添加“0”的情况? - Mahsa

11

尝试使用 Apache StringUtils 类。

import org.apache.commons.lang.StringUtils;
...

String seqNumber = "123"
int seqNumberLength = 10;
String result = StringUtils.leftPad(seqNumber, seqNumberLength,"0")

结果为0000000123


7

有几种方法可以做到这一点。您可以创建单元测试来测试这些方法的性能。需要自己测试:我是在没有任何编译的情况下编写的:

  1. Use the Apache StringUtils package;

    StringUtils.leftPad(yourString, 10, "0");
    
  2. A trick to avoid a for/while statement:

    String newString = "0000000000".concat(yourString);
    newString = newString.substring(newString.length() - 10);
    
  3. A trick using replace:

    String newString = String.format("%10s", youString).replace(" ", "0");
    
  4. Using a classic while with StringBuilder:

    StringBuilder sb = new StringBuilder(yourString);
    int charsToGo = 10 - sb.length();
    while(charsToGo > 0) {
       sb.insert(0, '0');
       charsToGo--;
    }
    
您可以封装一个StringUtils类,以避免导入过多的包来进行开发。

我知道这很古老,但是我必须为一个项目填充一个16个字符的十六进制字符串,并想着我会添加我的性能测试结果。结果是执行给定周期的填充所需的毫秒数。短输入(1个字符)- 123个周期 左填充9 sbAppend 0 substr 14 长输入(15个字符)- 123个周期 左填充0 sbAppend 0 substr 1 短输入(1个字符)- 1234个周期 左填充1 sbAppend 2 substr 3 长输入(15个字符)- 1234个周期 左填充0 sbAppend 1 substr 1 短输入(1个字符)- 12345个周期 左填充2 sbAppend 8 substr 6 - Nicky
长输入(15个字符)- 12345个周期 左填充2 sbAppend 1 substr 4 短输入(1个字符)- 123456个周期 左填充25 sbAppend 29 substr 22 长输入(15个字符)- 123456个周期 左填充5 sbAppend 13 substr 9 短输入(1个字符)- 1234567个周期 左填充65 sbAppend 135 substr 52 长输入(15个字符)- 1234567个周期 左填充67 sbAppend 59 substr 57 短输入(1个字符)- 12345678个周期 左填充494 sbAppend 806 substr 292 - Nicky
长输入(15个字符)- 12345678个周期 左填充403 sbAppend 298 substr 305 短输入(1个字符)- 123456789个周期 左填充5048 sbAppend 8281 substr 3064 长输入(15个字符)- 123456789个周期 左填充3998 sbAppend 2997 substr 3067 短输入(1个字符)- 1234567890个周期 左填充48295 sbAppend 83530 substr 31823 长输入(15个字符)- 1234567890个周期 左填充44088 sbAppend 32023 substr 30985 - Nicky

7

很遗憾,这并没有回答问题:如何用零填充字符串 - Howard
啊 - 我错过了。如果字符串中存储的是数字,可以使用Integer.valueOf(str)将其转换为数字。否则,我建议使用Apache StringUtils - Andy M.
如果您在答案中使用Integer.parseInt()进行更新,那么这是一个很好的回应。 - Duncan Jones

6

Google Guava 提供了Strings.padStart()方法来实现这个目的:

返回一个字符串,长度至少为minLength,该字符串由string前置padChar复制所需次数组成,以达到该长度。例如,

padStart("7", 3, '0') 返回 "007"

padStart("2010", 3, '0') 返回 "2010"


2
  1. 获取字符串的大小 - String.size();
  2. 如果大小小于10,则创建一个由零组成的字符串(需要多少个就循环几次)。
  3. 将两个字符串连接起来 - "零字符串"应该在前面。

希望这能帮到您!


1

这将使用任意填充字符处理任意字符串

public static String lpad(String s, int desiredLength, char padChar) {
  return Character.toString(padChar)
    .repeat(Math.max(0, desiredLength - s.length())) 
    + s;
}

这将接受一个数字,整数,长整型,大整数

String.format("%032d", number); // 0-padded to 32 characters

但是如果你来这里处理消息摘要哈希值

byte[] digestBytes = messageDigest.digest();
String.format("%032X", new BigInteger(1, digestBytes)); 

0
int value = 5;
String strValue = "" + value;

while (strValue.length() < 10) {
  strValue = "0" + strValue;
}

// strValue now equals "0000000005"
  • value替换为实际数字
  • 10替换为限制值(如果是固定的限制,可以考虑使用final变量)
  • 如果这是一个速度关键的操作,不要使用简单的字符串拼接,而应该考虑使用StringBufferStringBuilder


1
我认为无论是否需要速度,你都应该使用 StringBuilder - Brian Roach

0
int zeroesNeeded = 10 - myString.length();
while(zeroesNeeded > 0)
{
   myString = "0" + myString;
   zeroesNeeded--;
}

0
for (int i=0; i<(10-str.length); i++) {
    str = "0" + str;
}

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