删除Java中的尾随零

时间:2013-02-20 16:16:20

标签: java regex string

我有字符串(来自DB),它可能包含数值。如果它包含数值,我想删除尾随的零,如:

  • 10.0000
  • 10.234000

str.replaceAll("\\.0*$", ""),适用于第一个,但不适用于第二个。

许多答案指向使用BigDecimal,但我得到的String可能不是数字。所以我认为更好的解决方案可能是通过正则表达式。

11 个答案:

答案 0 :(得分:66)

有可能:

1000    -> 1000
10.000  -> 10 (without point in result)
10.0100 -> 10.01 
10.1234 -> 10.1234

我懒惰而且愚蠢,只是

s = s.indexOf(".") < 0 ? s : s.replaceAll("0*$", "").replaceAll("\\.$", "");

使用包含而不是indexof的相同解决方案,如某些注释中所述,以便于理解

 s = s.contains(".") ? s.replaceAll("0*$","").replaceAll("\\.$","") : s

答案 1 :(得分:16)

使用 DecimalFormat ,这是最干净的方式

String s = "10.1200";
DecimalFormat decimalFormat = new DecimalFormat("0.#####");
String result = decimalFormat.format(Double.valueOf(s));
System.out.println(result);

答案 2 :(得分:5)

我发现所有其他解决方案都太复杂了。简单地

s.replaceFirst("\\.0*$|(\\.\\d*?)0+$", "$1");

完成这项工作。它首先尝试第一个替代方案,以便后跟所有零的点被替换为空(因为该组没有被设置)。否则,如果它找到一个点后跟一些数字(由于惰性量词*?而尽可能少)后跟一些零,则零被丢弃,因为它们不包含在组中。 It works

警告

我的代码依赖于我的assumption that appending a unmatched group does nothing。这适用于Oracle实现,但不适用于其他人,包括 Android ,它们似乎附加了字符串&#34; null&#34;。我打电话给这些实施,因为它可能没有意义,但他们只是correct according to the Javadoc

答案 3 :(得分:4)

String value = "10.010"
String s = new DecimalFormat("0.####").format(Double.parseDouble(value));
System.out.println(s);

Output:

   10.01

答案 4 :(得分:1)

以下适用于以下所有示例:

"1" -> "1"
"1.0" -> "1"
"1.01500" -> "1.015"
"1.103" -> "1.103"

s = s.replaceAll("()\\.0+$|(\\..+?)0+$", "$2");

答案 5 :(得分:1)

Kent's字符串操作答案神奇地起作用,也适用于精确丢失,但这里使用BigDecimal是一个更清洁的解决方案

String value = "10.234000";
BigDecimal stripedVal = new BigDecimal(value).stripTrailingZeros();

然后您可以转换为其他类型

String stringValue = stripedVal.toPlainString();
double doubleValue = stripedVal.doubleValue();
long longValue = stripedVal.longValue();

如果精确损失是您最关心的问题,那么请获取准确的原始值。如果原语的任何精度损失,这将抛出ArithmeticException。见下文

int intValue = stripedVal.intValueExact();

答案 6 :(得分:0)

如何替换

(\d*\.\d*)0*$

通过

\1

答案 7 :(得分:0)

您可以替换为:

String result = (str.indexOf(".")>=0?str.replaceAll("\\.?0+$",""):str);

使Regex尽可能简单。 (并考虑评论中指出的1000等输入)

答案 8 :(得分:0)

首先分开小部分。然后你可以使用下面的逻辑。

BigDecimal value = BigDecimal.valueOf(345000);
BigDecimal div = new BigDecimal(10).pow(Integer.numberOfTrailingZeros(value.intValue()));
System.out.println(value.divide(div).intValue());

答案 9 :(得分:0)

我的实现可以在除法器之后选择位数:

public static String removeTrailingZero(String number, int minPrecise, char divider) {
    int dividerIndex = number.indexOf(divider);

    if (dividerIndex == -1) {
        return number;
    }

    int removeCount = 0;
    for (int i = dividerIndex + 1; i < number.length(); i++) {
        if (number.charAt(i) == '0') {
            removeCount++;
        } else {
            removeCount = 0;
        }
    }

    int fracLen = number.length() - dividerIndex - 1;

    if (fracLen - removeCount < minPrecise) {
        removeCount = fracLen - minPrecise;
    }

    if (removeCount < 0) {
        return number;
    }

    String result = number.substring(0, number.length() - removeCount);

    if (result.endsWith(String.valueOf(divider))) {
        return result.substring(0, result.length() - 1);
    }

    return result;
}

答案 10 :(得分:0)

除了肯特的答案。

Kotlin 中使用正则表达式时要小心。您必须手动编写Regex()构造函数,而不是简单的字符串!

s = if (s.contains(".")) 
        s.replace(Regex("0*\$"),"").replace(Regex("\\.\$"),"") 
    else s