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

该博客分享了一个用于格式化数值字符串的Java工具类,主要功能是去除小数点后的零并保留非数字部分。提供了两个方法:`trimZero1`使用字符串操作去除多余零,`trimZero2`利用BigDecimal的`stripTrailingZeros()`方法。同时,博客提到了返回前端时注意避免科学计数法的问题,并给出了相关方法。
摘要由CSDN通过智能技术生成

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

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();
    }
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值