【问题标题】:Left padding a String with Zeros [duplicate]用零填充字符串[重复]
【发布时间】:2011-05-27 01:32:45
【问题描述】:

我看到过类似的问题herehere

但我不知道如何用零填充字符串。

输入:“129018” 输出:“0000129018”

总输出长度应为 10。

【问题讨论】:

    标签: java string padding


    【解决方案1】:

    【讨论】:

    • 仅供参考,链接已失效。
    【解决方案2】:
    String paddedString = org.apache.commons.lang.StringUtils.leftPad("129018", 10, "0")
    

    第二个参数是想要的输出长度

    “0”是填充字符

    【讨论】:

    • 提醒一下...String 是不可变的(请参阅String is immutable. What exactly is the meaning?),因此StringUtils.leftPad(variable, 10, "0"); 不会更改variable 的值。您需要将结果分配给它,如下所示:variable = StringUtils.leftPad(variable, 10, "0");
    • 很高兴看到建议命令的输出而不需要运行它。在某处听说好的是懒惰的 :) 无论如何,这里是:StringUtils.leftPad("1", 3, '0') -> "001"。
    【解决方案3】:

    这会将任何字符串填充到总宽度为 10,而无需担心解析错误:

    String unpadded = "12345"; 
    String padded = "##########".substring(unpadded.length()) + unpadded;
    
    //unpadded is "12345"
    //padded   is "#####12345"
    

    如果你想向右填充:

    String unpadded = "12345"; 
    String padded = unpadded + "##########".substring(unpadded.length());
    
    //unpadded is "12345"
    //padded   is "12345#####"  
    

    您可以将“#”字符替换为您想要填充的任何字符,重复您希望字符串总宽度的次数。例如。如果您想在左侧添加零,使整个字符串长度为 15 个字符:

    String unpadded = "12345"; 
    String padded = "000000000000000".substring(unpadded.length()) + unpadded;
    
    //unpadded is "12345"
    //padded   is "000000000012345"  
    

    与 khachik 的答案相比,这样做的好处是它不使用 Integer.parseInt,它可能会引发异常(例如,如果您要填充的数字太大,例如 12147483647)。缺点是,如果您要填充的内容已经是 int,那么您必须将其转换为 String 并返回,这是不可取的。

    所以,如果您确定它是一个 int,那么 khachik 的答案就很有效。如果没有,那么这是一个可能的策略。

    【讨论】:

    • 可能需要注意要填充的字符串的长度——对 substring() 的调用可能会引发 IndexOutOfBoundsException。
    • 加上性能?如果我没记错的话,我认为它会创建 3 个不同的字符串。
    • 为什么会被赞成?它与 JavaScript 相关,而不是 Java?
    • @mhvelplund 由 Rick 于 3 月 2 日编辑,我认为他只是犯了一个错误,我已经撤消了更改。
    • 谢谢@Magnus,这绝对是个错误
    【解决方案4】:

    要格式化字符串使用

    import org.apache.commons.lang.StringUtils;
    
    public class test {
    
        public static void main(String[] args) {
    
            String result = StringUtils.leftPad("wrwer", 10, "0");
            System.out.println("The String : " + result);
    
        }
    }
    

    输出:字符串:00000wrwer

    第一个参数是要格式化的字符串,第二个参数是所需输出长度的长度,第三个参数是要填充字符串的字符。

    使用链接下载jarhttp://commons.apache.org/proper/commons-lang/download_lang.cgi

    【讨论】:

      【解决方案5】:

      如果您需要性能并知道字符串的最大大小,请使用:

      String zeroPad = "0000000000000000";
      String str0 = zeroPad.substring(str.length()) + str;
      

      注意最大字符串大小。如果它大于 StringBuffer 的大小,你会得到一个java.lang.StringIndexOutOfBoundsException

      【讨论】:

      • 这很好用。幸运的是,我正在处理二进制数,所以我知道最大值为 8。谢谢。
      • 这一点都不优雅。每次要填充时,都必须创建一个变量。
      【解决方案6】:

      我用过这个:

      DecimalFormat numFormat = new DecimalFormat("00000");
      System.out.println("Code format: "+numFormat.format(123));
      

      结果:00123

      希望对你有用!

      【讨论】:

        【解决方案7】:

        我更喜欢这段代码:

        public final class StrMgr {
        
            public static String rightPad(String input, int length, String fill){                   
                String pad = input.trim() + String.format("%"+length+"s", "").replace(" ", fill);
                return pad.substring(0, length);              
            }       
        
            public static String leftPad(String input, int length, String fill){            
                String pad = String.format("%"+length+"s", "").replace(" ", fill) + input.trim();
                return pad.substring(pad.length() - length, pad.length());
            }
        }
        

        然后:

        System.out.println(StrMgr.leftPad("hello", 20, "x")); 
        System.out.println(StrMgr.rightPad("hello", 20, "x"));
        

        【讨论】:

        • 我认为您的左右混淆了。 StrMgr.leftPad 正在将填充附加到字符串,StrMgr.rightPad 正在附加。对我来说(至少),我希望左填充在字符串的前面添加填充。
        • 是的,你说得对!现在打补丁!感谢@Passkit
        【解决方案8】:

        这是我的解决方案:

        String s = Integer.toBinaryString(5); //Convert decimal to binary
        int p = 8; //preferred length
        for(int g=0,j=s.length();g<p-j;g++, s= "0" + s);
        System.out.println(s);
        

        输出:00000101

        【讨论】:

          【解决方案9】:

          基于@Haroldo Macêdo's answer,我在我的自定义Utils类中创建了一个方法如

          /**
           * Left padding a string with the given character
           *
           * @param str     The string to be padded
           * @param length  The total fix length of the string
           * @param padChar The pad character
           * @return The padded string
           */
          public static String padLeft(String str, int length, String padChar) {
              String pad = "";
              for (int i = 0; i < length; i++) {
                  pad += padChar;
              }
              return pad.substring(str.length()) + str;
          }
          

          然后拨打Utils.padLeft(str, 10, "0");

          【讨论】:

          • 相比其他“聪明”的答案,我更喜欢诸如此类的简单逻辑方法,但我建议使用 StringBuffer 或 StringBuilder。
          【解决方案10】:

          Satish 的解决方案在预期答案中非常好。我想通过将变量 n 添加到格式化字符串而不是 10 个字符来使其更通用。

          int maxDigits = 10;
          String str = "129018";
          String formatString = "%"+n+"s";
          String str2 = String.format(formatString, str).replace(' ', '0');
          System.out.println(str2);
          

          这适用于大多数情况

          【讨论】:

            【解决方案11】:

            使用Google Guava:

            Maven:

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

            示例代码:

            Strings.padStart("129018", 10, '0') returns "0000129018"  
            

            【讨论】:

              【解决方案12】:

              这是一个基于 String.format 的解决方案,适用于字符串并且适用于可变长度。

              public static String PadLeft(String stringToPad, int padToLength){
                  String retValue = null;
                  if(stringToPad.length() < padToLength) {
                      retValue = String.format("%0" + String.valueOf(padToLength - stringToPad.length()) + "d%s",0,stringToPad);
                  }
                  else{
                      retValue = stringToPad;
                  }
                  return retValue;
              }
              
              public static void main(String[] args) {
                  System.out.println("'" + PadLeft("test", 10) + "'");
                  System.out.println("'" + PadLeft("test", 3) + "'");
                  System.out.println("'" + PadLeft("test", 4) + "'");
                  System.out.println("'" + PadLeft("test", 5) + "'");
              }
              

              输出: '000000测试' '测试' '测试' '0测试'

              【讨论】:

                【解决方案13】:

                固定长度为 10 的右填充: String.format("%1$-10s", "abc") 固定长度为 10 的左填充: String.format("%1$10s", "abc")

                【讨论】:

                【解决方案14】:

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

                假设我们的第一个数字是 129018。我们想在其中添加零,因此最终字符串的长度将为 10。为此,您可以使用以下代码

                    int number=129018;
                    int requiredLengthAfterPadding=10;
                    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);
                

                【讨论】:

                  【解决方案15】:

                  这是另一种方法:

                  int pad = 4;
                  char[] temp = (new String(new char[pad]) + "129018").toCharArray()
                  Arrays.fill(temp, 0, pad, '0');
                  System.out.println(temp)
                  

                  【讨论】:

                    【解决方案16】:
                        int number = -1;
                        int holdingDigits = 7;
                        System.out.println(String.format("%0"+ holdingDigits +"d", number));
                    

                    刚刚在采访中问过这个............

                    我的回答在下面,但是这个(上面提到的)要好得多->

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

                    我的回答是:

                    static String leadingZeros(int num, int digitSize) {
                        //test for capacity being too small.
                    
                        if (digitSize < String.valueOf(num).length()) {
                            return "Error : you number  " + num + " is higher than the decimal system specified capacity of " + digitSize + " zeros.";
                    
                            //test for capacity will exactly hold the number.
                        } else if (digitSize == String.valueOf(num).length()) {
                            return String.valueOf(num);
                    
                            //else do something here to calculate if the digitSize will over flow the StringBuilder buffer java.lang.OutOfMemoryError 
                    
                            //else calculate and return string
                        } else {
                            StringBuilder sb = new StringBuilder();
                            for (int i = 0; i < digitSize; i++) {
                                sb.append("0");
                            }
                            sb.append(String.valueOf(num));
                            return sb.substring(sb.length() - digitSize, sb.length());
                        }
                    }
                    

                    【讨论】:

                    • 为什么你在第一种情况下返回错误,而不是异常(如果这是你的要求),你打破了函数的返回模式。为什么不像第二种情况那样只返回数字的字符串值(因为这也是泛型方法的有效输入)
                    【解决方案17】:
                    String str = "129018";
                    StringBuilder sb = new StringBuilder();
                    
                    for (int toPrepend=10-str.length(); toPrepend>0; toPrepend--) {
                        sb.append('0');
                    }
                    
                    sb.append(str);
                    String result = sb.toString();
                    

                    【讨论】:

                    • +1 是唯一不使用外部库的正确答案
                    • 只需观察StringBuilder的缓冲区大小,默认为16,对于大格式的大小正确设置缓冲区大小,如:StringBuilder sb = new StringBuilder();
                    【解决方案18】:

                    如果你的字符串只包含数字,你可以把它变成一个整数然后做填充:

                    String.format("%010d", Integer.parseInt(mystring));
                    

                    如果不是I would like to know how it can be done

                    【讨论】:

                    • 正在拔头发,因为我没有看到我必须执行 Integer.parseInt()。
                    • 另外,对于那些想用其他非“0”的东西填充数字/字符串的人,将%0更改为%yourchoice
                    • 请注意:此解决方案对于较大的整数值失败(例如:“9999999999”);因此我选择了使用 Apache commons 的 Oliver Michels 解决方案。
                    • 对于像“9999999999”这样的大整数值,String.format() 支持BigInteger 像这样:String.format("%010d", new BigInteger("9999999999"))
                    • @micnguyen 你确定? “%”后面的“0”是一个标志。可能的标志非常有限。
                    【解决方案19】:

                    一个老问题,但我也有两种方法。


                    对于固定(预定义)长度:

                        public static String fill(String text) {
                            if (text.length() >= 10)
                                return text;
                            else
                                return "0000000000".substring(text.length()) + text;
                        }
                    

                    对于可变长度:

                        public static String fill(String text, int size) {
                            StringBuilder builder = new StringBuilder(text);
                            while (builder.length() < size) {
                                builder.append('0');
                            }
                            return builder.toString();
                        }
                    

                    【讨论】:

                      【解决方案20】:
                      String str = "129018";
                      String str2 = String.format("%10s", str).replace(' ', '0');
                      System.out.println(str2);
                      

                      【讨论】:

                      • 这是一种比公认答案更迂回的方法。
                      • @PaulW: 但它适用于字符串
                      • 如果字符串中有空格,这将不起作用...
                      猜你喜欢
                      • 2014-05-13
                      • 2016-08-14
                      • 2020-03-04
                      • 2012-02-17
                      • 1970-01-01
                      • 2017-04-04
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多