首頁 > 軟體

Java去掉小數點後面無效0的方案與建議

2022-07-05 22:01:23

一:需求

當小數位很多的時候,小數位後面可能有一些多餘的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內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com