如何在左侧用零填充整数?

1220

在Java中将int转换为String时,如何用零进行左侧填充?

我基本上想要用前导零填充整数,直到达到9999(例如,1 = 0001)。


2
没错,就是这样!我的错...我在手机上输入的。你也不需要使用"new String":Integer.toString(num+10000).subString(1)就可以了。 - Randyaa
Long.valueOf("00003400").toString(); Integer.valueOf("00003400").toString(); --->3400 - frekele
1
请参考以下链接中的解决方案和图表,以在Java中打印具有前导零的整数:https://dev59.com/YZTfa4cB1Zd3GeqPOkgl#35521965 - bvdb
如果num大于9999,那么使用new String(Integer.toString(num + 10000)).substring(1)的方法就会有问题。 - Felype
20个回答

1957

1
我应该期望String.format中的选项类似于C语言中的printf()吗? - Ehtesh Choudhury
18
如果你需要对大量的数值进行此操作,DecimalFormat的性能至少比String.format()快3倍。我现在正在进行性能调优,并在Visual VM中运行这两种方法,结果显示String.format()方法消耗的CPU时间约为DecimalFormat.format()方法的3-4倍。 - Steve Ferguson
16
为了添加超过9个零,请使用类似于“%012d”的东西。 - Mohammad Banisaeid
2
这适用于Java 5及以上版本。对于1.4及以下版本,DecimalFormat是一种替代方法,如此处所示:http://javadevnotes.com/java-integer-to-string-with-leading-zeros - JavaDev
1
大家好!我在使用时遇到了一些问题:%d 无法格式化 java.lang.String 参数 - Helio Soares Junior
显示剩余4条评论

191

假设你想将11打印为011

你可以使用格式化字符串: "%03d".

输入图片说明

你可以像这样使用这个格式化字符串:

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

或者,一些Java方法直接支持这些格式化程序:

System.out.printf("%03d", a);

5
@Omar Koohei确实如此,但它解释了“魔术常数”背后的推理。 - bvdb
好的回答!只是一点评论,format()中的F应该是fString.format(...); - David Miguel
如果我不想添加前导0而是另一个字母/数字怎么办?谢谢。 - chiperortiz
1
据我所知,使用上述格式化工具无法实现。在这种情况下,我会计算所需的前导字符(例如 int prefixLength = requiredTotalLength - String.valueOf(numericValue).length),然后使用重复字符串方法创建所需的前缀。有多种重复字符串的方法,但据我所知,Java 中没有本地的方法:https://dev59.com/U3M_5IYBdhLWcg3ww2Ob - bvdb
@chiperortiz 从Java 11开始,有一个String.repeat方法。 - bvdb

123

如果由于任何原因你使用的是Java 1.5之前的版本,那么可以尝试使用Apache Commons Lang方法。

org.apache.commons.lang.StringUtils.leftPad(String str, int size, '0')

36

发现这个例子...会测试一下...

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

我测试过这个,并且:

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

两者都可以使用,但根据我的需求,我认为String.Format更好并且更简洁。


1
是的,我本来想建议使用DecimalFormat,因为我不知道String.format,但后来看到了uzhin的回答。String.format一定是新的。 - Paul Tomblin
这与在 .Net 中的做法类似,只是对于小数字而言,.Net 的方式看起来更好。 - Omar Kooheji
在我的情况下,我使用了第一种选项(DecimalFormat),因为我的数字是Double类型的。 - mauronet

33

试试这个:

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

24

以下是不使用 DecimalFormat 来格式化字符串的方法:

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

09

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

019

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

0119


23

如果性能对你很重要,你可以自己完成操作,相比于String.format函数,开销会更少:

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

性能表现

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

结果

自定义函数:1697毫秒

String.format:38134毫秒


2
上面提到使用DecimalFormat更快,你有任何相关的注释吗? - Patrick
@Patrick 关于 DecimalFormat 的性能问题,也可以参考:https://dev59.com/7Woy5IYBdhLWcg3wcNhO - Stephan
令人震惊!这个函数的表现如此糟糕。我不得不对一组无符号整数进行零填充和显示,这些整数可以在1到3位之间变化。它需要快速运行。我使用了这种简单的方法:for( int i : data ) strData += (i > 9 ? (i > 99 ? "" : "0") : "00") + Integer.toString( i ) + "|"; 它非常快速地工作(抱歉我没有计时!)。 - BuvinJ
在运行足够长时间以便HotSpot对其进行优化后,性能如何比较? - Phil

18

您可以使用Google Guava

Maven:

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

示例代码:

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

注意:

Guava 是一个非常有用的库,它还提供了许多与CollectionsCachesFunctional idiomsConcurrencyStringsPrimitivesRangesIOHashingEventBus等相关的功能。

参考: GuavaExplained


1
以上示例代码仅供使用,不是真正的示例代码。注释反映了这一点,您需要使用“String myPaddedString = Strings.padStart(...)”。 - JoeG
2
这种方法实际上比JDK String.format / MessageFormatter / DecimalFormatter提供了更好的性能结果。 - rafalmag

3
尽管上述方法都很不错,但有时我们也需要格式化整数和浮点数。这在我们需要在小数点左右填充特定数量的零时非常有用。
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(",",""));  
 }    
}  

3
int x = 1;
System.out.format("%05d",x);

如果您想直接将格式化的文本打印到屏幕上,请使用以下方法。

2
但是 OP 从未要求过。在内部,String.formatSystem.out.format 调用相同的 java.util.Formatter 实现。 - bsd
...并且System.out可以被重定向。 - Phil

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