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!

推薦閱讀: