这是否正确REGEX从字符串中删除尾随小数和零?我无法让它工作。我错过了什么?正则表达式从字符串中删除前导/尾随零
78.80 - > 78.8
str.replaceAll("^.0*$", "");
我只需要2小数点以及像78.008应78.01
并且如果它是78.10只有78.1。
这是否正确REGEX从字符串中删除尾随小数和零?我无法让它工作。我错过了什么?正则表达式从字符串中删除前导/尾随零
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}
:如果您使用*
你会得到一个Look-behind group does not have an obvious maximum length
,因为*
将被转换为{0,2147483647}
并考虑\\.
将溢出的“+1”的长度,所以我们把最大数量可能的数字(2147483647,有符号整数的最大值)减1。
随着锚^
和$
你想整个字符串匹配和替换它。而这将不匹配,因为字符串中有更多。
试试这个
str.replace("0*$", "");
随着0*$
您将在字符串的结尾匹配只能0或多个“0”。
注意:这也将“1000”更改为“1”!
+1用于指定它也将'1000'更改为'1'。 – 2013-02-22 07:41:30
既然你想四舍五入的数字,你不应该使用正则表达式。您应该使用DecimalFormat
:
DecimalFormat twoDForm = new DecimalFormat("#.#");
Double d = Double.parseDouble("123.078");
String s = twoDForm.format(d);
System.out.println(s);
将输出:
123.08
相同数量甚至@tbsalling;) – 2013-02-22 07:39:46
无我有一些另外在... – Sam 2013-02-22 07:40:43
记得显示*的代表性样本输入*。另外,你的“新增”与原文无异。 **将“78.008”更改为“78.01”不同于“删除..尾随零”**。让我们来关闭这个问题。打开另一个问题,询问“正确的事情”,可能是:“我如何打印精度最高为2位小数的浮点数?” (但*确保首先搜索*)。 – 2013-02-22 07:41:34