如何在左边填充零的整数?


1021

在Java中int转换为a时,如何在左边用零填充pad String

我基本上希望将整数填充到9999前导零(例如1 = 0001)。


2
是的,就是这样!我的坏...我在手机上打了。您不需要“新字符串”:Integer.toString(num + 10000).subString(1)有效。
兰迪亚2014年

Long.valueOf(“ 00003400”)。toString(); Integer.valueOf(“ 00003400”)。toString(); ---> 3400
frekele

1
另请参见stackoverflow.com/questions/35521278/…有关具有图的解决方案
bvdb

但是,new String(Integer.toString(num + 10000)).substring(1)如果num大于9999,则该方法存在问题。
Felype

Answers:


1693

java.lang.String.format(String,Object...)像这样使用:

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

用于长度为5的零填充。对于十六进制输出,d用中的xas 替换"%05x"

完整格式选项作为的一部分进行了说明java.util.Formatter


1
我应该期望其中的选项String.format类似于C中的printf()吗?
Ehtesh Choudhury 2011年

13
如果必须对较大的值列表执行此操作,则DecimalFormat的性能至少比String.format()好3倍。我正在自己进行一些性能调整,并且在Visual VM中运行二者,显示String.format()方法以DecimalFormat.format()的速率大约3-4倍地累积CPU时间。
史蒂夫·弗格森

10
并增加超过9个零使用类似%012d
穆罕默德Banisaeid

2
这适用于Java 5及更高版本。对于1.4及更低版本,DecimalFormat是一种替代方法,如下所示:javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev

1
嗨,大家好!我在使用时遇到一些问题:%d can't format java.lang.String arguments
Helio Soares Junior

115

假设您要打印11011

你可以使用一个格式化"%03d"

在此处输入图片说明

您可以这样使用此格式化程序:

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

另外,一些java方法直接支持以下格式器:

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

5
@Omar Koohei确实如此,但是它解释了“魔术常数”背后的原因。
bvdb

好答案!只是注释,Fformat()的应该是fString.format(...);
大卫·米格尔

如果我不想附加前导0但另一个字母/数字怎么办?谢谢
chiperortiz 19'01 /

1
@chiperortiz afaik无法使用上述格式工具。在那种情况下,我计算所需的前导字符(例如int prefixLength = requiredTotalLength - String.valueOf(numericValue).length),然后使用重复字符串方法创建所需的前缀。有多种重复字符串的方法,但是没有本机的Java语言afaik:stackoverflow.com/questions/1235179/…–
bvdb


29

找到了这个例子...将进行测试...

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,2009年

这与您在.Net中的处理方式类似。除了.Net方式对较小的数字看起来更好。
Omar Kooheji 09年

在我的情况下,我使用了第一个选项(DecimalFormat),因为我的电话号码是Double
mauronet,2016年

21

如果性能在您的情况下很重要,则与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");
}

结果

自身功能: 1697ms

字符串格式 38134ms


1
上面提到使用DecimalFormat更快。你有什么笔记吗?
帕特里克

@Patrick有关DecimalFormat的性能,请参见:stackoverflow.com/questions/8553672/…–
Stephan

令人震惊!功能是如此糟糕的是坚果。我必须对键盘进行零填充,并显示一组可能在1到3位数字之间的无符号整数。它需要快速地工作。我使用了这种简单的方法:for( int i : data ) strData += (i > 9 ? (i > 99 ? "" : "0") : "00") + Integer.toString( i ) + "|";效果非常快(很抱歉,我没有计时!)。
BuvinJ

在足以让HotSpot破解后运行的性能如何比较?
菲尔(Phil)

16

您可以使用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 '16

2
与JDK String.format / MessageFormatter / DecimalFormatter相比,此方法实际上提供了更好的性能结果。
rafalmag '17

10

试试这个:

import java.text.DecimalFormat; 

DecimalFormat df = new DecimalFormat("0000");
String c = df.format(9);   // 0009
String a = df.format(99);  // 0099
String b = df.format(999); // 0999

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

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

如果要将格式化的文本直接打印到屏幕上。


1
但是OP从未要求过它。在内部String.formatSystem.out.format调用相同的java.util.Formatter实现。
2013年

...和System.out可以重定向。
菲尔(Phil)

1

使用类DecimalFormat,如下所示:

NumberFormat formatter = new DecimalFormat("0000"); //i use 4 Zero but you can also another number
System.out.println("OUTPUT : "+formatter.format(811)); 

输出: 0000811


1

这是不使用即可格式化字符串的方法DecimalFormat

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

09

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

019

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

0119


0

检查我的适用于整数和字符串的代码。

假设我们的第一个数字为2,并且我们想要在其上添加零,以便最终字符串的长度为4。为此,您可以使用以下代码

    int number=2;
    int requiredLengthAfterPadding=4;
    String resultString=Integer.toString(number);
    int inputStringLengh=resultString.length();
    int diff=requiredLengthAfterPadding-inputStringLengh;
    if(inputStringLengh<requiredLengthAfterPadding)
    {
        resultString=new String(new char[diff]).replace("\0", "0")+number;
    }        
    System.out.println(resultString);

(new char[diff])为什么
艾萨克

replace("\0", "0")什么...什么
以撒

@Isaac-首先,我创建了一个char数组,然后使用该char数组创建了一个字符串。然后我将空字符(这是char类型的默认值)替换为“ 0”(这是我们在此处用于填充的char)
Fathah Rehman P

0

您需要使用格式化程序,以下代码使用NumberFormat

    int inputNo = 1;
    NumberFormat nf = NumberFormat.getInstance();
    nf.setMaximumIntegerDigits(4);
    nf.setMinimumIntegerDigits(4);
    nf.setGroupingUsed(false);

    System.out.println("Formatted Integer : " + nf.format(inputNo));

输出:0001


-2
public static String zeroPad(long number, int width) {
   long wrapAt = (long)Math.pow(10, width);
   return String.valueOf(number % wrapAt + wrapAt).substring(1);
}

这种方法的唯一问题是,它会让您戴上思考的帽子来弄清楚它是如何工作的。


5
唯一的问题?具有负尝试它number或具有width大于18
user85421

2
好点子。而且我猜它的功能超出了要求,因为它会在宽度上截断(这不是明确要求的,但通常是必需的)。Java的String.format()不支持可变宽度并且完全不支持整数说明符,这真是太可惜了。
johncurrier 2011年

-3

不需要软件包:

String paddedString = i < 100 ? i < 10 ? "00" + i : "0" + i : "" + i;

这会将字符串填充为三个字符,并且很容易为四个或五个添加更多部分。我知道这在任何方面都不是完美的解决方案(尤其是如果您需要大填充字符串),但是我喜欢它。


1
嗯...我喜欢。
卡蒂克·楚
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.