数值型字符串格式化工具类以及可能运用场景
工作中遇到的需求格式化数值型字符串,需求如下:
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