工作中遇到的需求格式化数值型字符串,需求如下:
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();
}
}
想看更多精彩内容,可以关注我的博客园
我的博客园