2013-02-22 127 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

相關問題