正则表达式从字符串中删除前导/尾随零

时间:2013-02-22 07:34:04

标签: java regex

这是从字符串中删除尾随小数和零的正确REGEX吗?我无法让它发挥作用。我错过了什么?

  

78.80 - > 78.8

str.replaceAll("^.0*$", "");

我只需要2个小数点,就像78.008应该是78.01

如果是78.10,则只有78.1。

3 个答案:

答案 0 :(得分:3)

不,正确的正则表达式更复杂,需要积极的后视。

str = str.replaceAll("\\.0*$|(?<=\\.[0-9]{0,2147483646})0*$", "");

你必须转义.,因为否则它意味着“任何字符”,你必须将正则表达式仅锚定到字符串的末尾,你必须说0位数必须在.加上一些可选的非零数字之后。

附录:应该处理一个“特殊情况”:1.00。我们使用|处理它。第一个子表达式意味着“一个点加上只有零”并且甚至匹配点(以这种方式删除)

请记住,在Java字符串中是不可变的,因此replaceAll将创建一个新字符串。

请注意使用{0,2147483646}:如果您使用*,则会获得Look-behind group does not have an obvious maximum length,因为*会转换为{0,2147483647}并考虑它将溢出的\\.的“+1”长度,因此我们将最大可能位数(2147483647,有符号整数的最大值)减去1作为点。

测试示例:http://ideone.com/0NDTSq

答案 1 :(得分:2)

由于您想要舍入数字,因此不应使用正则表达式。您应该使用DecimalFormat

DecimalFormat twoDForm = new DecimalFormat("#.#");
Double d = Double.parseDouble("123.078");
String s = twoDForm.format(d);
System.out.println(s);

将输出:

123.08

答案 2 :(得分:1)

使用锚点^$,您尝试匹配整个字符串并替换它。这将不匹配,因为字符串中有更多。

试试这个

 str.replace("0*$", "");

使用0*$,您将在字符串末尾仅匹配0或更多“0”。

注意:这也会将“1000”更改为“1”!