如何从数字文本中删除前导零?

5
我用这个方法来从输入字符串中去除前导零。
return a.replaceAll("^0+",""); 

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

只删除数字的前导零,例如:

00002827393 -> 2827393

如果您有一个包含数字和字母的编号,那么前导零不能被删除,例如:

000ZZ12340 -> 000ZZ12340

1
@syb0rg 这不完全相同。在那篇帖子中,所有包含字母数字的字符串都删除了零。但是在这里,它们仅从数字中删除。 - John Kugelman
澄清请求:字母数字字符可以出现在字符串的任何位置还是仅限于前导零后面? - aartist
@Harish 目前为止您还没有找到这个问题的答案吗? - Trying
请参考这个链接 - dARKpRINCE
5个回答

10

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

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

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

另外:

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

7
你也可以尝试这个方法:
a.replaceAll("^0+(?=\\d+$)", "")

请注意,正向先行断言 (?=\\d+$) 检查在匹配/替换任何内容之前,字符串的剩余部分(在由^0+匹配的起始0之后)是否仅由数字组成。
System.out.println("00002827393".replaceAll("^0+(?=\\d+$)", ""));
System.out.println("000ZZ12340".replaceAll("^0+(?=\\d+$)", ""));
2827393
000ZZ12340

那是一些看起来很可怕的正则表达式。 - Mike Rylander
1
@MikeRylander:不,这个正则表达式看起来很吓人。 - Colin DeClue
@ColinDeClue 哦,亲爱的上帝,为什么! - Mike Rylander

4

测试输入的字符串是否匹配数字模式“\d+”。 "\ d"是数字的字符类。 如果是数字,则返回调用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

0

我只是简单地做了以下操作

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

1
  1. 你错过了这部分内容:“如果你有一个字母数字号码,前导零不能被删除”。
  2. 如果你的字符串有20个前导零,那么你将创建20个需要进行垃圾回收的字符串。
- stenix

0
逻辑: 它将把字符串转换为字符数组并从i=0开始;一旦它遇到第一个数字值,它就会从for循环中退出,一旦它遇到第一个字符(不是1到9),它就会返回相同的字符串。在第一个for循环之后,我们需要考虑以下情况:
case 1. 00000000000
case 2. 00000011111
case 3. 11111111111

如果i的值为1或3(即第一个for循环中i的值为0或字符串长度),则返回字符串。否则,对于第二种情况,从字符数组复制到一个新的字符数组,从i的值开始(i的值将从第一个for循环中获取,并且它保存了第一个数字值的位置)。希望这样清楚明白。

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

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