【问题标题】:How to remove leading zeros from numeric text?如何从数字文本中删除前导零?
【发布时间】:2013-03-31 04:04:18
【问题描述】:

我正在使用它从输入字符串中删除前导零。

return a.replaceAll("^0+",""); 

但是上面的字符串甚至可以从任何字母数字字符串中删除。我不想那样做。我的要求是:

仅应删除数字的前导零,例如

00002827393 -> 2827393

如果您有字母数字,则不得删除前导零,例如

000ZZ12340 -> 000ZZ12340

【问题讨论】:

  • @syb0rg 这不太一样。在那篇文章中,从所有字母数字字符串中删除了零。在这里,它们仅从数字中删除。
  • 要求澄清:字母数字字符可以在字符串中的任何位置或前导零之后?
  • @Harish 你到现在都找不到这个问题的答案?
  • this

标签: java


【解决方案1】:

您可以先检查您的字符串是否仅由数字组成:

Pattern p = Pattern.compile("^\\d+$");
Matcher m = p.matcher(a);

if(m.matches()){
  return a.replaceAll("^0+", "");
} else {
  return a;
}

还有:

  • 考虑将您的模式设为静态,这样它只会创建一次
  • 您可能希望在一个较小的函数中使用匹配器隔离部分,例如“isOnlyDigit”

【讨论】:

    【解决方案2】:

    你也可以试试这个:

    a.replaceAll("^0+(?=\\d+$)", "")
    

    请注意,正向前瞻 (?=\\d+$) 会检查字符串的其余部分(在起始 0s 之后,由 ^0+ 匹配)在匹配/替换任何内容之前仅由数字组成。


    System.out.println("00002827393".replaceAll("^0+(?=\\d+$)", ""));
    System.out.println("000ZZ12340".replaceAll("^0+(?=\\d+$)", ""));
    
    2827393 000ZZ12340

    【讨论】:

    • 那是一些看起来很吓人的正则表达式
    • @MikeRylander:不,this 是一个看起来很吓人的正则表达式。
    • @ColinDeClue 天哪,为什么!
    【解决方案3】:

    测试传入的字符串是否匹配数字模式“\d+”。 "\d" 是character class for digits。如果是数字,则返回调用结果到replaceAll,否则返回原字符串。

    if (str.matches("\\d+"))
        return str.replaceAll("^0+", "");
    return str;
    

    测试:

    public static void main (String[] args) throws java.lang.Exception
    {
       System.out.println(replaceNumZeroes("0002827393"));
       System.out.println(replaceNumZeroes("000ZZ1234566"));
    }
    

    产生输出

    2827393
    000ZZ1234566
    

    【讨论】:

      【解决方案4】:

      逻辑: 它将字符串转换为 char 数组并从 i=0 开始;一旦它击中第一个数字值,它就会从 for 循环中中断,并且一旦它击中第一个字符(除了 1 到 9),它就会返回相同的字符串。在第一个 for 循环之后,我们需要考虑以下情况:

      case 1. 00000000000
      case 2. 00000011111
      case 3. 11111111111
      

      如果它是 1 或 3(即第一个 for 循环中的 i 值将是 0 或字符串的长度),那么只需返回字符串。否则,对于第二种情况,从 char 数组复制到一个新的 char 数组,该数组以 i 的值开始(我们将从第一个 for 循环中获得 i 的值,它保存第一个数值位置。)。希望它清除。

          public String trimLeadingZeros(String str)
          {
          if (str == null)
          {
              return null; //if null return null
          }
          char[] c = str.toCharArray();
          int i = 0;
      
          for(; i<c.length; i++)
          {
              if(c[i]=='0')
              {
                 continue; 
              }
              else if(c[i]>='1' && c[i]<='9')
              {
                  break;
              }
              else
              {
                  return str;
              }
          }
          if(i==0 || i==c.length)
          {
              return str;
          }
          else
          {
              char[] temp = new char[c.length-i];
              int index = 0;
              for(int j=i; j<c.length; j++)
              {
                  temp[index++] = c[j];
              }
              return new String(temp);
          }
          }
      

      【讨论】:

        【解决方案5】:

        我只是做了以下

        String string = string.trim();
        while(string.charAt(0) == '0'){
            string = string.substring(1);
        }
        

        【讨论】:

        • 1.您错过了“如果您有字母数字,则不得删除前导零”的部分。 2. 如果你的字符串有 20 个前导零,你将创建 20 个需要被垃圾回收的字符串。
        猜你喜欢
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        • 2019-05-02
        • 2011-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多