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

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

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 lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

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

/**
 * @author JiaXinMa
 * @description 数字格式化转化工具类
 * @date 2021/12/16
 */
@Slf4j
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[] spiltNumber1(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
     * @result string[] 第一位为数字,第二位为非数字
     */
    public static String[] spiltNumber(String numberStr) {

        StringBuilder lastBuilder = new StringBuilder();
        int temp = 0;

        while (!isNumber(numberStr.substring(0, numberStr.length() - temp++))) {
            lastBuilder.append(numberStr, numberStr.length() - temp, numberStr.length() + 1 - temp);
        }

        return new String[]{numberStr.substring(0, numberStr.length() - temp), reversalStringBuilder(lastBuilder).toString()};
    }

    /**
     * @author: JiaXinMa
     * @description: 倒序 123 -> 321
     * @date: 2022/3/8
     */
    public static StringBuilder reversalStringBuilder(StringBuilder builder) {
        StringBuilder endBuilder = new StringBuilder();
        int temp = 0;
        while (builder.length() - temp++ > 0) {
            endBuilder.append(builder.substring(builder.length() - temp, builder.length() + 1 - temp));
        }
        return endBuilder;
    }

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

想看更多精彩内容,可以关注我的博客园
我的博客园


版权声明:本文为weixin_38295272原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。