数值型字符串格式化工具类以及可能运用场景

工作中遇到的需求格式化数值型字符串,需求如下:

1.00千克格式化为1千克。如果是3.21500元就格式化为3.215元。

1.00格式化为1.如果3.21500就格式化为3.215。

数值字符串去零小数点等,操作建议用BigDecimal的ap i =》stripTrailingZeros()

刚开始不熟悉BigDecimal用法就用String的api进行判断,感觉不是很好。

返回前端如果太建议转为字符串返回,因为BigDecimal有一些坑就是可能第7小数后变成科学计数法,用 toPlainString() 获取一个字符串返回前端,别用BigDecimal返回,他又会变成科学计数法

写了个工具类:

package com.yblue.utils;

import org.springframework.util.StringUtils;

import java.math.BigDecimal;
import java.util.regex.Pattern;

/**
 * @author JiaXinMa
 * @description 数字格式化转化工具类
 * @date 2021/12/16
 * 
 */
public class NumberStrFormatUtil {

    /**
     *  @author: JiaXinMa
     *  @description: 数字字符串格式化
     *  @date:  2021/12/16
     *  如1.00千克格式化为1千克。如果是3.21500元就格式化为3.215元这种,
     *  把小数点后面的0都格式化掉
     *  拼接上该字符串尾部所有非数字字符串
     */
    public static String numberFormat(String numberStr) {

        if (StringUtils.isEmpty(numberStr)) {
            return numberStr;
        }

        String[] result = spiltNumber(numberStr);

        return trimZero1(result[0]) + result[1];
    }

    /**
     *  @author: JiaXinMa
     *  @description: 去除数字多余的数字和.
     *  @date:  2021/12/16
     *  如1.00格式化为1。如果是3.21500就格式化为3.215这种,
     *  把小数点后面的0都格式化掉
     */
    private static String trimZero1(String numberStr) {

        if (StringUtils.isEmpty(numberStr)) {
            return numberStr;
        }

        if (numberStr.contains(".")) {
            int size = numberStr.length() - (numberStr.substring(0, numberStr.indexOf(".")).length());

            for (int i = 0; i < size; i++) {
                if (numberStr.endsWith("0")) {
                    numberStr = numberStr.substring(0, numberStr.length() - 1);
                } else if (numberStr.endsWith(".")) {
                    numberStr = numberStr.substring(0, numberStr.indexOf("."));
                    break;
                } else {
                    break;
                }
            }
        }
        return numberStr;
    }

    /**
     *  @author: JiaXinMa
     *  @description: 去除数字多余的数字和.
     *  @date:  2021/12/16
     *  如1.00格式化为1。如果是3.21500就格式化为3.215这种,
     *  把小数点后面的0都格式化掉
     */
    public static String trimZero2(String numberStr){

        if (StringUtils.isEmpty(numberStr)) {
            return numberStr;
        }

        return new BigDecimal(numberStr).stripTrailingZeros().toPlainString() ;
    }

    /**
     *  @author: JiaXinMa
     *  @description: 分割数字字符串(尾部为非数字)
     *  @date:  2021/12/16
     *  @result string[] 第一位为数字,第二位为非数字
     */
    public static String[] spiltNumber(String numberStr){
        String lastStr = "";

        while (!isNumber(numberStr)) {
            lastStr = numberStr.substring(numberStr.length() - 1) + lastStr;
            numberStr = numberStr.substring(0, numberStr.length() - 1);
        }

        return new String[]{numberStr,lastStr};
    }


    /**
     *  @author: JiaXinMa
     *  @description: 判断字符串是否为数字
     *  @date:  2021/12/16
     */
    public static boolean isNumber(String str) {
        Pattern pattern = Pattern.compile("^(\\-|\\+)?\\d+(\\.\\d+)?$");
        return pattern.matcher(str).matches();
    }
}
 package com.yblue.utils;

import org.springframework.util.StringUtils;

import java.math.BigDecimal;
import java.util.regex.Pattern;

/**
 * @author JiaXinMa
 * @description 数字格式化转化工具类
 * @date 2021/12/16
 * 
 */
public class NumberStrFormatUtil {

    /**
     *  @author: JiaXinMa
     *  @description: 数字字符串格式化
     *  @date:  2021/12/16
     *  如1.00千克格式化为1千克。如果是3.21500元就格式化为3.215元这种,
     *  把小数点后面的0都格式化掉
     *  拼接上该字符串尾部所有非数字字符串
     */
    public static String numberFormat(String numberStr) {

        if (StringUtils.isEmpty(numberStr)) {
            return numberStr;
        }

        String[] result = spiltNumber(numberStr);

        return trimZero1(result[0]) + result[1];
    }

    /**
     *  @author: JiaXinMa
     *  @description: 去除数字多余的数字和.
     *  @date:  2021/12/16
     *  如1.00格式化为1。如果是3.21500就格式化为3.215这种,
     *  把小数点后面的0都格式化掉
     */
    private static String trimZero1(String numberStr) {

        if (StringUtils.isEmpty(numberStr)) {
            return numberStr;
        }

        if (numberStr.contains(".")) {
            int size = numberStr.length() - (numberStr.substring(0, numberStr.indexOf(".")).length());

            for (int i = 0; i < size; i++) {
                if (numberStr.endsWith("0")) {
                    numberStr = numberStr.substring(0, numberStr.length() - 1);
                } else if (numberStr.endsWith(".")) {
                    numberStr = numberStr.substring(0, numberStr.indexOf("."));
                    break;
                } else {
                    break;
                }
            }
        }
        return numberStr;
    }

    /**
     *  @author: JiaXinMa
     *  @description: 去除数字多余的数字和.
     *  @date:  2021/12/16
     *  如1.00格式化为1。如果是3.21500就格式化为3.215这种,
     *  把小数点后面的0都格式化掉
     */
    public static String trimZero2(String numberStr){

        if (StringUtils.isEmpty(numberStr)) {
            return numberStr;
        }

        return new BigDecimal(numberStr).stripTrailingZeros().toPlainString() ;
    }

    /**
     *  @author: JiaXinMa
     *  @description: 分割数字字符串(尾部为非数字)
     *  @date:  2021/12/16
     *  @result string[] 第一位为数字,第二位为非数字
     */
    public static String[] spiltNumber(String numberStr){
        String lastStr = "";

        while (!isNumber(numberStr)) {
            lastStr = numberStr.substring(numberStr.length() - 1) + lastStr;
            numberStr = numberStr.substring(0, numberStr.length() - 1);
        }

        return new String[]{numberStr,lastStr};
    }


    /**
     *  @author: JiaXinMa
     *  @description: 正则判断字符串是否为数字
     *  @date:  2021/12/16
     */
    public static boolean isNumber(String str) {
        Pattern pattern = Pattern.compile("^(\\-|\\+)?\\d+(\\.\\d+)?$");
        return pattern.matcher(str).matches();
    }
}
 

 

想看更多精彩内容,可以关注我的CSDN

我的CSDN

posted @ 2021-12-16 16:03  Yblue  阅读(51)  评论(0编辑  收藏  举报