這是否正確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