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

Posted

技术标签:

【中文标题】如何格式化带有前导零的Java字符串?【英文标题】:How to format a Java string with leading zero? 【发布时间】:2011-05-02 09:37:12 【问题描述】:

这里是字符串,例如:

"Apple"

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

"000Apple"

我该怎么做?

【问题讨论】:

【参考方案1】:
 StringUtils.leftPad(yourString, 8, '0');

这是来自commons-lang。 See javadoc

【讨论】:

为什么不使用 commons-lang?它有很多有用的附加功能。 即使你不能使用commons-lang,你也可以很容易地从StringUtils复制源码来制作你自己的函数。这将是一个比所选答案更好的通用解决方案。 docjar.com/html/api/org/apache/commons/lang/… 如果这将是该库的唯一使用方法怎么办?可能添加的库甚至比使用它的应用程序大很多倍。我可以想象在应用程序中添加公共库的一些原因。不要误会我的意思:我同意,它包含非常有用的东西,但我理解如果不需要编写一个(或几个)方法的好处,我不愿意将一个充满外部 JAR 的应用程序塞满。 用一个具体的例子来回答“为什么不使用commons-lang?它有很多有用的附加功能。” 问题。小米在其 android 设备上发布了一个过时的 commons-lang 版本。在您的应用中包含较新版本会导致类加载器冲突,因此无法再在任何 Android 项目中使用 commons-lang。 @Nachi 即使应该存在过时的 StringUtils.leftPad【参考方案2】:
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);
    

【讨论】:

但我想在字符串而不是 int 之前添加前导零。 您可以在 Java 1.4 及以下版本中使用 StringUtils 或 DecimalFormat。在这里查看javadevnotes.com/java-integer-to-string-with-leading-zeros @Variag 使用%07s 而不是%07d,你会得到一个FormatFlagsConversionMismatchException。你可以试试看。【参考方案3】:

使用Apache Commons StringUtils.leftPad(或查看代码制作自己的函数)。

【讨论】:

【参考方案4】:

它并不漂亮,但它确实有效。如果您可以访问 apache commons,我建议您使用它

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

【讨论】:

-1 可能是因为这不是一个很好的例子:您正在使用“幻数”并且正在连接字符串,应该使用 StringBuilder 或 StringBuffer 来替换。 这不是一个好的答案,因为val - 8 不是 Java 的正确逻辑,会导致编译错误【参考方案5】:
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);
    

【讨论】:

【参考方案6】:

如果您必须在没有图书馆帮助的情况下这样做:

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

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

【讨论】:

这很聪明——但我花了大约 30 秒才“搞定”。我认为更具可读性的解决方案会更好。 当您将软件嵌入到没有太多空间的东西上并且额外的库不是一个选项时,这是一个非常好的解决方案。谢谢!! 这个版本快疯了!我喜欢它。 @Mathu 老实说这并不难理解。连接两个字符串(连接在一起)并从中提取前 5 个字符。没有魔法。在这种情况下不是很明智(对于固定字符串 Apple)但很容易理解。 ("0000" + theString).substring(theString.length()) 更真实。这用前导零填充theString。抱歉无法抗拒添加此评论:) 这个解决方案的语法很短,但它不是“疯狂的快”。如果幸运的话,编译器会对其进行优化,但本质上真正“快速”的方法是使用StringBuilder,它需要一个循环来填充它。如果要求真的只截断 8 个字符的字符串,那没关系,虽然这是一个非常狭窄的用例,但这个解决方案永远不能被称为快速。很短。【参考方案7】:

您可能需要处理边缘情况。这是一个通用方法。

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;
    

【讨论】:

【参考方案8】:
String input = "Apple";
StringBuffer buf = new StringBuffer(input);

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


String output = buf.toString();

【讨论】:

【参考方案9】:
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);

【讨论】:

【参考方案10】:

您可以使用另一个答案中使用的 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);

这仍然是一个混乱的解决方案,但它的优点是您可以使用整数参数指定结果字符串的总长度。

【讨论】:

【参考方案11】:

这速度很快,适用于任何长度。

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

【讨论】:

【参考方案12】:

我相信这就是他真正要求的:

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

输出:

000Apple

【讨论】:

不适用于一般情况;如果您用长度为 8 个字符的字符串(在 OP 的情况下可能)替换“Apple”,则会抛出 DuplicateFormatFlagsException(因为格式字符串中的 00)。如果您替换一个长度超过 8 个字符的字符串,则会抛出一个 IllegalFormatFlagsException(因为是负数)​​。 你是对的,但那又如何呢:String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8); 。现在你不会有这个异常了。 只想添加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【参考方案13】:

当大多数 in String 有 8 个字符时,可以比 Chris Lercher answer 更快

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

在我的机器上快 1/8。

【讨论】:

【参考方案14】:

你可以用这个:

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

【讨论】:

迄今为止最好的答案。 Apache commons StringUtils 是一个简单但非常有用的库。 这样节省了很多时间,而且干净整洁。【参考方案15】:

使用 Guava 的 Strings 实用程序类:

Strings.padStart("Apple", 8, '0');

【讨论】:

【参考方案16】:

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

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

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

【讨论】:

那么你可能想先拆分字符串,将上面的操作应用于第一个拆分值,而不是连接其余的拆分值。【参考方案17】:

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

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

【讨论】:

【参考方案18】:
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;
    

【讨论】:

虽然欢迎使用此代码 sn-p,并且可能会提供一些帮助,但它会是 greatly improved if it included an explanation of 如何解决这个问题。没有这个,你的回答就没有多少教育价值了——记住你是在为未来的读者回答这个问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。【参考方案19】:

在 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 的方法)。它与所有其他解决方案都有点不同,我特别喜欢它。

【讨论】:

【参考方案20】:

有没有人尝试过这个纯 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");

不幸的是,此解决方案仅适用于字符串中没有空格的情况。

【讨论】:

【参考方案21】:

如果你想用纯 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

【讨论】:

【参考方案22】:

使用方法 String::repeat (Java 11) 的解决方案

String str = "Apple";
String formatted = "0".repeat(8 - str.length()) + str;

如果需要,将 8 更改为另一个数字或参数化它

【讨论】:

【参考方案23】:

你可以使用:

String.format("%08d", "Apple");

这似乎是最简单的方法,不需要任何外部库。

【讨论】:

String.format("%08d", anInteger); // 这对我有用。字符串版本抛出异常 这不会运行。 同意@Heiner,用数字格式格式化String会失败。【参考方案24】:

我喜欢Pad a String with Zeros的解决方案

String.format("%1$" + length + "s", inputString).replace(' ', '0');

长度 = "8" 和 inputString = "Apple"

【讨论】:

以上是关于如何格式化带有前导零的Java字符串?的主要内容,如果未能解决你的问题,请参考以下文章

格式字符串,带前导零的整数

如何在java中获取带有前导零的整数中的位数?

如何在 JavaScript 中输出带有前导零的数字? [复制]

如何将带有前导零的数字字符串转储为 yaml-cpp 中的有效 yaml 字符串?

格式化带前导符号的数字

带前导零的 Barcode4j UPCA 扫描码