Java中如何去除数字前导零

13
public static String removeLeadingZeroes(String value):

给定一个有效的、非空的输入,该方法应返回删除所有前导零的输入。因此,如果输入是“0003605”,该方法应返回“3605”。特殊情况下,当输入只包含零时(如“000”或“0000000”),该方法应返回“0”。

public class NumberSystemService {
/**
 * 
 * Precondition: value is purely numeric
 * @param value
 * @return the value with leading zeroes removed.
 * Should return "0" for input being "" or containing all zeroes
 */
public static String removeLeadingZeroes(String value) {
     while (value.indexOf("0")==0)
         value = value.substring(1);
          return value;
}

我不知道如何为字符串 "0000" 编写代码。


6
这个帖子应该能回答你的问题: https://dev59.com/JHE85IYBdhLWcg3wYigB - alien01
在你的while循环开始处添加一个if语句来查找该条件。 - dsh
14个回答

37
如果字符串始终包含有效的整数,则return new Integer(value).toString();是最简单的方法。
public static String removeLeadingZeroes(String value) {
     return new Integer(value).toString();
}

它说是数字,所以"0000.1"可能是一个条目,但我喜欢你的答案。 - Alex S. Diaz

16
  1. 不要重新发明轮子。 你遇到的几乎所有软件开发问题都不是第一次遇到; 相反,它只是你第一次遇到它。
  2. 你几乎需要的每个实用方法都已经被Apache项目和/或guava项目编写好了(或者类似于我没有遇到的其他项目)。
  3. 阅读Apache StringUtils JavaDoc页面。 这个工具很可能已经提供了你所需要的所有字符串操作功能。

一些解决你问题的示例代码:

public String stripLeadingZeros(final String data)
{
    final String strippedData;

    strippedData = StringUtils.stripStart(data, "0");

    return StringUtils.defaultString(strippedData, "0");
}

1
绝对是最好的答案。有经验的程序员尽可能使用经过验证的代码。 StringUtils 的答案比“未经测试但接近”的答案好得多。 - Tihamer
准确无误应该是这里最好的答案,像魔法一样有效。 - Kevin STS
1
针对问题中的“特殊情况”,代码无法正常工作 - 它返回一个空字符串而不是“0”。为了使其正常工作,您可以将defaultString替换为defaultIfEmpty。这与最新版本的commons-lang3(3.11)相关,可能在一些旧版本中它是有效的。 - amseager
但是,我完全同意答案开头的陈述。我真的很想在SO的主页上看到第一个,第二个则在Java标签页面上。 - amseager
这比例如 "" + Integer.parseInt(origVal) 更加复杂。虽然 parseInt 版本可能会在非数字上崩溃,但有时这也是您想要的。只有在经过验证的代码使您的解决方案更简单时,才需要添加经过验证的第三方代码。它肯定不会比语言内置更可靠。 - sf_jeff
非异常版本:“val = val.isNumber() ? "" + Integer.parseInt(val) : val”。请注意,对于非数字,这与上面的解决方案不同,因为它假定如果结果不是数字,则不想修剪0(可能超过50%)。 - sf_jeff

2
你可以在字符串长度上添加一个检查:
public static String removeLeadingZeroes(String value) {
     while (value.length() > 1 && value.indexOf("0")==0)
         value = value.substring(1);
         return value;
}

1
  1. Convert input to StringBuilder

  2. Use deleteCharAt method to remove character from beginning till non-zero character is found

    String trimZero(String str) {
        StringBuilder strB = new StringBuilder(str);
        int index = 0;
    
        while (strB.length() > 0 && strB.charAt(index) == '0') {
            strB.deleteCharAt(index);
        }
    
        return strB.toString();
    }
    

1
private String trimLeadingZeroes(inputStringWithZeroes){
    final Integer trimZeroes = Integer.parseInt(inputStringWithZeroes);
    return trimZeroes.toString();
}

欢迎来到Stack Overflow!虽然这段代码可能解决了问题,但包括解释真的有助于提高您的帖子质量。请记住,您正在为未来的读者回答问题,而这些人可能不知道您的代码建议的原因。来自审查 - Ferrybig

1
public String removeLeadingZeros(String digits) {
    //String.format("%.0f", Double.parseDouble(digits)) //Alternate Solution
    String regex = "^0+";
    return digits.replaceAll(regex, "");
}

removeLeadingZeros("0123"); //Result -> 123
removeLeadingZeros("00000456"); //Result -> 456
removeLeadingZeros("000102030"); //Result -> 102030

1
你可以使用下面的替换函数,它可以用于包含字母数字或数字的字符串。
s.replaceFirst("^0+(?!$)", "")

1

我建议首先检查这种情况。逐个字符地循环遍历字符串,并检查非“0”字符。如果你看到非“0”字符,请使用你之前的处理方法。如果没有,返回“0”。以下是我将如何做(未经测试,但接近)

boolean allZero = true;
for (int i=0;i<value.length() && allZero;i++)
{
    if (value.charAt(i)!='0')
        allZero = false;
}
if (allZero)
    return "0"
...The code you already have

1
使用 if (s.matches("^0+$")) 会更简单。 - TNT
好的观点,但是为了满足“对于输入为空字符串或仅包含零的情况应返回“0””,我们应该使用“^0*$”对吧? - John C
给定一个有效的、非空的输入。 - TNT
/** * * 前提条件:value是纯数字 * @param value * @return 删除前导零的值。 * 对于输入为""或全为零的情况,应返回"0" */ 似乎无法在注释中正确设置格式,但从方法文档中可以看出。 - John C

0

我发现以下方法最简单可靠,因为它适用于整数和浮点数:

public static String removeNonRequiredLeadingZeros(final String str) {
    return new BigDecimal(str).toPlainString();
}

您可能需要检查传入的字符串是否为null和空白,并使用trim函数删除前导和尾随的空格。

您还可以通过使用以下方法来去除尾随的零:

public static String removeNonRequiredZeros(final String str) {
    return new BigDecimal(str).stripTrailingZeros().toPlainString();
}

1
在最后一个中,您可能想要使用 toPlainString。否则,600.0 将在 toString 中变为 6e2。 - TT.

0
使用String.replaceAll(),像这样:
    public String replaceLeadingZeros(String s) {
        s = s.replaceAll("^[0]+", "");
        if (s.equals("")) {
            return "0";
        }

        return s;
    }

这将匹配所有前导零(使用正则表达式 ^[0]+)并将它们全部替换为空白。最后,如果你只剩下一个空字符串,请返回“0”。


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