这是从字符串中删除尾随小数和零的正确REGEX吗?我无法让它发挥作用。我错过了什么?
78.80 - > 78.8
str.replaceAll("^.0*$", "");
我只需要2个小数点,就像78.008应该是78.01
如果是78.10,则只有78.1。
答案 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作为点。
答案 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”!