这是从字符串中删除尾随小数和零的正确正则表达式吗?我无法让它工作。我错过了什么?
78.80 -> 78.8
str.replaceAll("^.0*$", "");
我只需要 2 个小数点,就像 78.008 应该是 78.01
如果是 78.10,则只有 78.1。
不,正确的正则表达式更复杂,它需要积极的后视。
str = str.replaceAll("\\.0*$|(?<=\\.[0-9]{0,2147483646})0*$", "");
您必须转义.
,因为否则它意味着“任何字符”,您必须将正则表达式仅锚定到字符串的末尾,并且您必须说0
数字必须在.
加上一些可选的非零数字之后。
附录:有一个“特殊情况”需要处理:1.00
. 我们使用|
. 第一个子表达式的意思是“一个点只加零”,甚至匹配点(以这种方式被删除)
请记住,在 Java 中字符串是不可变的,因此replaceAll
将创建一个新字符串。
注意使用{0,2147483646}
: 如果你使用了a*
你会得到带符号的 int) 减 1 表示点。Look-behind group does not have an obvious maximum length
*
{0,2147483647}
\\.
测试示例:http: //ideone.com/0NDTSq
由于您希望对数字进行四舍五入,因此不应使用正则表达式。你应该使用DecimalFormat
:
DecimalFormat twoDForm = new DecimalFormat("#.#");
Double d = Double.parseDouble("123.078");
String s = twoDForm.format(d);
System.out.println(s);
将输出:
123.08
使用锚点^
,$
您正在尝试匹配整个字符串并替换它。这将不匹配,因为字符串中有更多内容。
试试这个
str.replace("0*$", "");
与0*$
您将仅匹配字符串末尾的 0 个或多个“0”。
注意:这也会将“1000”更改为“1”!