2013-02-22 134 views
-3

这是否正确REGEX从字符串中删除尾随小数和零?我无法让它工作。我错过了什么?正则表达式从字符串中删除前导/尾随零

78.80 - > 78.8

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

我只需要2小数点以及像78.008应78.01

并且如果它是78.10只有78.1。

+0

相同数量甚至@tbsalling;) – 2013-02-22 07:39:46

+0

无我有一些另外在... – Sam 2013-02-22 07:40:43

+3

记得显示*的代表性样本输入*。另外,你的“新增”与原文无异。 **将“78.008”更改为“78.01”不同于“删除..尾随零”**。让我们来关闭这个问题。打开另一个问题,询问“正确的事情”,可能是:“我如何打印精度最高为2位小数的浮点数?” (但*确保首先搜索*)。 – 2013-02-22 07:41:34

回答

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

+0

'8700'呢? – 2013-02-22 07:40:36

+0

我已经修改它以包含一个'.'(OP小数点分隔符) – xanatos 2013-02-22 07:42:22

+0

。 8700应该是8700 – Sam 2013-02-22 07:42:54

1

随着锚^$你想整个字符串匹配和替换它。而这将不匹配,因为字符串中有更多。

试试这个

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

随着0*$您将在字符串的结尾匹配只能0或多个“0”。

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

+1

+1用于指定它也将'1000'更改为'1'。 – 2013-02-22 07:41:30

2

既然你想四舍五入的数字,你不应该使用正则表达式。您应该使用DecimalFormat

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

将输出:

123.08 
+0

这就是要走的路。 – 2013-02-22 07:51:50

+0

是的,我使用相同的,但问题是8.80所需的输出是8.8然后.. – Sam 2013-02-22 07:55:26

+1

DecimalFormat(“#。#”);将删除所有尾随零... – yiannis 2013-02-22 08:01:49

相关问题