删除Java中的尾随零

fiv*_*nts 35 java regex string

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

  • 10.0000
  • 10.234000

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

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

Ken*_*ent 74

有可能:

1000    -> 1000
10.000  -> 10 (without point in result)
10.0100 -> 10.01 
10.1234 -> 10.1234
Run Code Online (Sandbox Code Playgroud)

我是懒惰和愚蠢的

s = s.indexOf(".") < 0 ? s : s.replaceAll("0*$", "").replaceAll("\\.$", "");
Run Code Online (Sandbox Code Playgroud)

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

 s = s.contains(".") ? s.replaceAll("0*$","").replaceAll("\\.$","") : s
Run Code Online (Sandbox Code Playgroud)

  • 为了清楚起见,你可以用`!s.contains(".")`替换`s.indexOf(".")<0`. (7认同)
  • @Kent"为了清晰" (5认同)

Sru*_*lla 18

使用最简洁的DecimalFormat

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


小智 11

Kent 的字符串操作答案神奇地起作用并且还可以满足精度损失,但是这里有一个使用 BigDecimal 的更清洁的解决方案

String value = "10.234000";
BigDecimal stripedVal = new BigDecimal(value).stripTrailingZeros();
Run Code Online (Sandbox Code Playgroud)

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

String stringValue = stripedVal.toPlainString();
double doubleValue = stripedVal.doubleValue();
long longValue = stripedVal.longValue();
Run Code Online (Sandbox Code Playgroud)

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

int intValue = stripedVal.intValueExact();
Run Code Online (Sandbox Code Playgroud)


maa*_*nus 6

我发现所有其他解决方案都太复杂了.只是

s.replaceFirst("\\.0*$|(\\.\\d*?)0+$", "$1");
Run Code Online (Sandbox Code Playgroud)

做的工作.它首先尝试第一个替代方案,以便后跟所有零的点被替换为空(因为该组未被设置).否则,如果它找到一个点后跟一些数字(由于延迟量词而尽可能少*?)后跟一些零,则零被丢弃,因为它们不包含在组中.它有效.

警告

我的代码依赖于我的假设,即追加一个不匹配的组什么都不做.这对于Oracle实现来说是正确的,但对于包括Android在内的其他人来说却是如此,它们似乎附加了字符串"null".我打电话给这样的实现,因为它可能没有意义,但根据Javadoc它们是正确的.

  • @maaartinus:看看他们的个人资料,他们可能会在Android上执行代码. (2认同)

PAC*_*PAC 6

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

Output:

   10.01
Run Code Online (Sandbox Code Playgroud)

  • Hiya,虽然可以很好地回答这个问题,但请注意,其他用户可能不如您熟悉。您为什么不添加一些有关此代码为何起作用的解释?谢谢! (4认同)