Java去掉小數點後面無效0的方案與建議
一:需求
當小數位很多的時候,小數位後面可能有一些多餘的0並沒有任何實際意義。所以在某些業務需求下可以去掉這些多餘的0。例如:0.2000可以用0.2來表示。
二:方案
2.1 正則匹配
/** * 去掉給定字符串(小數)後面的無效0 * * @param value 小數的字符串表示 * @return 如果轉換失敗,返回null */ public String convertByPattern(String value) { String regex = "^(-?\\d*)(\\.?0*)$"; Matcher matcher = Pattern.compile(regex).matcher(value); if (matcher.find()) { return matcher.group(1); } String regex1 = "^(-?\\d*\\.\\d*[1-9])(0*)$"; Matcher matcher1 = Pattern.compile(regex1).matcher(value); if (matcher1.find()) { return matcher1.group(1); } return null; }
當使用正則匹配的時候,需要代碼中的兩種正則表達式來進行匹配判斷組合。第一種正則表達式用來匹配小數點後面全是0的值,例如122.000。第二種正則表達式用來匹配小數點後面存在非0數值的值,例如109.00200。
上述方法支持正數和負數的處理
在正則表達式中,使用分組的方式來實現,在正則匹配過程中,將要保留的部分放在第一個括號中,即組1,那麼最終獲取值的時候,就可以使用group(1)直接拿到
關於兩個表達式:
表達式1:^(-?\d*)(\.?0*)$:
-?:正負數的匹配均支持
\d*:0個到n個數字,即匹配整數部分
到這裡,小數點前面部分就匹配完瞭,所以前面的部分可以作為第一組
\.?:可以匹配0個或1個小數點
0*:可以匹配0個或1個數值0
第二個分組可有可無。因為表達式1主要使用用來識別出無小數點或者是小數點後面是若幹個0的格式
表達式2:^(-?\d*\.\d*[1-9])(0*)$:
-?:正負數的匹配均支持
\d*:0個到n個數字,即匹配整數部分
\.:匹配小數點
\d*[1-9]:匹配小數部分,因為表達式2的目的是匹配小數點後面存在非0數值。那麼[1-9]就是用來匹配最後一個非0數值的
(0*) $:如果最後一個為是非0數值,那麼不會匹配到任何。如果最後一位是0,那麼這裡匹配到的就是最後一個非0數值後面的所有0
2.2 BigDecimal
/** * 通過將字符串(小數)轉換為decimal * @param value 小數的字符串表示 * @return */ public String convertByBigDecimal(String value) { BigDecimal bigDecimal = new BigDecimal(value); BigDecimal bigDecimal1 = bigDecimal.stripTrailingZeros(); return bigDecimal1.toPlainString(); }
上述方法是將字符串轉換為BigDecimal ,然後使用BigDecimal 原生方法stripTrailingZeros來去掉後面的無效0。同樣的正負數均支持
三:測試
public static void main(String[] args) { /** * (-)100 * (-)123 * (-)123.0000 * (-)100.0000 * (-)123.0 * (-)100.0 * (-)123.0900 * (-)100.0900 * (-)123.0009 * (-)100.0009 */ List<String> strings = Arrays.asList("100", "-100", "123", "-123", "123.0000", "-123.0000", "100.0000", "-100.0000", "123.0", "-123.0", "100.0", "-100.0", "123.0900", "-123.0900", "100.0900", "-100.0900", "123.0009", "-123.0009", "100.0009", "-100.0009"); for (String value : strings) { String s = new ZeroFormatTest2().convertByPattern(value); String s1 = new ZeroFormatTest2().convertByBigDecimal(value); System.out.println(s + "----" + s1); } }
結果輸出:
100—-100
-100—–100
123—-123
-123—–123
123—-123
-123—–123
100—-100
-100—–100
123—-123
-123—–123
100—-100
-100—–100
123.09—-123.09
-123.09—–123.09
100.09—-100.09
-100.09—–100.09
123.0009—-123.0009
-123.0009—–123.0009
100.0009—-100.0009
-100.0009—–100.0009
四:建議
上述兩種方法都可以實現我們的需求,但是從性能上面來講,如果需要解析大量數據的時候,建議使用第一種,Pattern.compile(regex)可以是一個全局的,不需要每一條數據都實例化
到此這篇關於Java去掉小數點後面無效0的文章就介紹到這瞭,更多相關Java去掉小數點後面無效0內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 一文搞懂Java正則表達式的使用
- Java中Pattern用法實例(正則表達式)
- Java正則表達式之分組和替換方式
- java如何使用正則表達式限制特殊字符的個數
- Java正則表達式匹配不到結果的解決