在项目中有一些这样的单位换算场景,将10000 转为 1万 … 索性收集一些,统一记录于此 ~
任重而道远,远兮近兮
示例:10000
转为 1万
package com.包名;
import com.alipay.mobile.common.utils.StringUtils;
import java.math.BigDecimal;
import java.text.NumberFormat;
public class NumDataUtil {
public static String formatNumberWithUnit(String needFormatNumber) {
final String noNumDefaultValue = "0";
/* if (!NumberUtils.isNumber(needFormatNumber)) {
return noNumDefaultValue;
}*/
if (!StringUtils.isNumeric(needFormatNumber)) {
return noNumDefaultValue;
}
String nuit = "", formatNumStr = "";
StringBuffer sb = new StringBuffer();
BigDecimal b1 = new BigDecimal("10000");
BigDecimal b2 = new BigDecimal("100000000");
BigDecimal needNum = new BigDecimal(needFormatNumber);
if (needNum.compareTo(b1) == -1) {
sb.append(needNum.toString());
}
// 以万为单位处理
else if ((needNum.compareTo(b1) == 0 || needNum.compareTo(b1) == 1) && needNum.compareTo(b2) == -1) {
formatNumStr = needNum.divide(b1).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
nuit = "万";
}
// 以亿为单位处理
else if (needNum.compareTo(b2) == 0 || needNum.compareTo(b2) == 1) {
formatNumStr = needNum.divide(b2).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
nuit = "亿";
}
if (StringUtils.isNotBlank(formatNumStr)) {
sb.append(showAmountHandle(formatNumStr)).append(nuit);
}
if (sb.length() == 0) {
return noNumDefaultValue;
}
return sb.toString();
}
public static String showAmountHandle(String finishedCount) {
if (StringUtils.isBlank(finishedCount)) {
return BigDecimal.ZERO.toString();
}
NumberFormat nf = NumberFormat.getInstance();
nf.setGroupingUsed(false);
return String.valueOf(nf.format(new BigDecimal(finishedCount).doubleValue()));
}
}
示例:123123.12
转为壹拾贰万叁仟壹佰贰拾叁元壹角贰分
import java.util.Scanner;
public class Test {
//数字单位
private static final String[] NUMBERS_UNITS= {"拾","佰","仟","万"};
public static void main(String[] args) {
Test st=new Test();
Scanner scanner=new Scanner(System.in);
System.out.println("请输入金额:");
//获取前端传递过来的金额数字
String money=scanner.nextLine();
//1.判断是否为null
st.isNull(money);
//2.判断是否有非法字符
st.isIllegal(money);
//3.判断是否超过限额
String[] array=st.isBeyondMax(money);
//4.整数位字符转换
StringBuffer chineseInt=st.convertInt(array[0]);
//5.判断有无小数位
if(array.length==2) {
//6.有则进行小数位字符转换
StringBuffer chineseDec=st.convertDec(array[1]);
//7.拼接整数和小数位
chineseInt=chineseInt.append(chineseDec);
}
//8.将转为大写的金额设置回总线
System.out.println(chineseInt);
}
/**
* 将小数位的金额数字转化为中文大写
* @param string 金额数字
* @return 转为中文的金额数字
*/
private StringBuffer convertDec(String string) {
StringBuffer str=convert(string);
switch(str.length()) {
case 1:
str.append("角");
break;
case 2:
str.append("分");
str.insert(1, "角");
break;
}
return str;
}
/**
* 将整数位的金额数字对应转化为中文大写
* @param string 金额数字
* @return 转为中文的金额数字
*/
private StringBuffer convertInt(String string) {
StringBuffer str=convert(string);
int length=str.length()-1;
for (int i = 0,j=str.length()-1; i < length; i++,j--) {
int v=i%4;
System.out.println("i:"+i+" j:"+j+" v:"+v+" "+str.toString());
str.insert(j, NUMBERS_UNITS[v]);
}
str.append("元");
return str;
}
/**
* 循环整个字符串,替换字符
* @param string 要替换的字符串
* @return 替换好的字符
*/
private StringBuffer convert(String string) {
StringBuffer str=new StringBuffer(string);
for (int i = 0; i < str.length(); i++) {
str.replace(i, i+1,replaceCharacter(str.substring(i, i+1)));
}
return str;
}
/**
* 将给定的数字字符替换为对应的中文数字字符
* @param string 数字字符
* @return 中文数字字符
*/
private String replaceCharacter(String string) {
switch(string) {
case "0":
string="零";
break;
case "1":
string="壹";
break;
case "2":
string="贰";
break;
case "3":
string="叁";
break;
case "4":
string="肆";
break;
case "5":
string="伍";
break;
case "6":
string="陆";
break;
case "7":
string="柒";
break;
case "8":
string="捌";
break;
case "9":
string="玖";
break;
}
return string;
}
/**
* 检测传入金额字符是否为空
* @param money 金额字符
*/
private void isNull(String money) {
if(money == null) {
//抛出异常
}
}
/**
* 检测传入金额字符是否符合条件
* @param money 金额字符
*/
private void isIllegal(String money) {
if(!money.matches("\\d+.?\\d*")) {
//抛出异常
}
}
/**
* 检测传入金额字符是否超出最大值
* @param money 金额字符
* @return 返回拆分的金额数字
*/
private String[] isBeyondMax(String money) {
String[] array=money.split("\\.");
//整数位不能超过9位,小数位不能超过2为
if(array[0].length()>9 || (array.length>1 &&array[1].length()>2)) {
//抛出异常
}
return array;
}
}
以下方法,尚未亲测
package com.dessert.common.enu;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
public class UnitConversion {
/**
* 默认保留两位小数,四舍五入
*
* @param value 原始数值
* @param original 原始单位
* @param need 转换的单位
* @return
*/
public static BigDecimal conversion(BigDecimal value, UnitsEnum original, UnitsEnum need) {
return conversion(value, original, need, 2);
}
/**
* @param value 原始数值
* @param original 原始单位
* @param need 转换的单位
* @param scale 小数点位数
* @return
*/
public static BigDecimal conversion(BigDecimal value, UnitsEnum original, UnitsEnum need, int scale) {
if (original == UnitsEnum.UN_KNOWN || need == UnitsEnum.UN_KNOWN) {
throw new IllegalArgumentException("存在不支持的单位参数");
}
if (original.category != need.category) {
throw new IllegalArgumentException("转换单位不统一!" + original.category.name + "不能转换为" + need.category.name);
}
return value == null ? new BigDecimal(0) : value.multiply(need.rate).divide(original.rate, scale, BigDecimal.ROUND_HALF_UP);
}
/**
* 默认保留两位小数,四舍五入
*
* @param value 原始数值
* @param original 原始单位
* @param need 转换的单位
* @return
*/
public static BigDecimal conversion(BigDecimal value, String original, String need) {
return conversion(value, getUnitEnum(original), getUnitEnum(need));
}
public static UnitsEnum getUnitEnum(String unit) {
if (StringUtils.isNotEmpty(unit)) {
for (UnitsEnum unitEnum : UnitsEnum.values()) {
for (String possibleName : unitEnum.possibleNames) {
if (possibleName.equals(unit.toLowerCase())) {
return unitEnum;
}
}
}
}
return UnitsEnum.UN_KNOWN;
}
public enum UnitsEnum {
LG_KM(CategoryEnum.LENGTH, "km", new String[]{"km", "千米"}, new BigDecimal("0.001"), "千米"),
LG_M(CategoryEnum.LENGTH, "m", new String[]{"m", "米"}, new BigDecimal("1"), "米"),
LG_Dm(CategoryEnum.LENGTH, "dm", new String[]{"dm", "分米"}, new BigDecimal("10"), "分米"),
LG_CM(CategoryEnum.LENGTH, "cm", new String[]{"cm", "厘米"}, new BigDecimal("100"), "厘米"),
LG_MM(CategoryEnum.LENGTH, "mm", new String[]{"mm", "毫米"}, new BigDecimal("1000"), "毫米"),
LG_UM(CategoryEnum.LENGTH, "um", new String[]{"um", "微米"}, new BigDecimal("1000000"), "微米"),
LG_NM(CategoryEnum.LENGTH, "nm", new String[]{"nm", "纳米"}, new BigDecimal("1000000000"), "纳米"),
LG_INCH(CategoryEnum.LENGTH, "inch", new String[]{"in", "inch", "英寸"}, new BigDecimal("39.3700787"), "英寸"),
EG_T(CategoryEnum.WEIGHT, "t", new String[]{"t", "吨"}, new BigDecimal("0.001"), "吨"),
EG_KG(CategoryEnum.WEIGHT, "kg", new String[]{"kg", "千克"}, new BigDecimal("1"), "千克"),
EG_G(CategoryEnum.WEIGHT, "g", new String[]{"g", "克"}, new BigDecimal("1000"), "克"),
EG_MG(CategoryEnum.WEIGHT, "mg", new String[]{"mg", "毫克"}, new BigDecimal("1000000"), "毫克"),
EG_UG(CategoryEnum.WEIGHT, "μg", new String[]{"μg", "ug", "微克"}, new BigDecimal("1000000000"), "微克"),
EG_LB(CategoryEnum.WEIGHT, "lb", new String[]{"lb", "lbs", "磅"}, new BigDecimal("2.2046226"), "磅"),
EG_OZ(CategoryEnum.WEIGHT, "oz", new String[]{"oz", "盎司"}, new BigDecimal("35.2739619"), "盎司"),
EG_CT(CategoryEnum.WEIGHT, "ct", new String[]{"ct", "克拉"}, new BigDecimal("5000"), "克拉"),
UN_KNOWN(null, "未知", null, new BigDecimal("0"), "未知");
private CategoryEnum category;
private String units;
private String[] possibleNames;
private BigDecimal rate;
private String description;
UnitsEnum(CategoryEnum category, String units, String[] possibleNames, BigDecimal rate, String description) {
this.category = category;
this.units = units;
this.possibleNames = possibleNames;
this.rate = rate;
this.description = description;
}
public CategoryEnum getCategory() {
return category;
}
public String getUnits() {
return units;
}
public String[] getPossibleNames() {
return possibleNames;
}
public BigDecimal getRate() {
return rate;
}
public String getDescription() {
return description;
}
private enum CategoryEnum {
LENGTH("length", UnitsEnum.LG_M, "长度"),
WEIGHT("weight", UnitsEnum.EG_KG, "重量");
private String name;
private UnitsEnum base;
private String description;
CategoryEnum(String name, UnitsEnum base, String description) {
this.name = name;
this.base = base;
this.description = description;
}
public String getName() {
return name;
}
public UnitsEnum getBase() {
return base;
}
public String getDescription() {
return description;
}
}
}
}
场景:假设输入为 80000 ,单位就会变为 万
private val unit = arrayOf("", "", "", "", "万", "十万", "百万", "千万", "亿", "十亿", "百亿", "千亿", "兆", "十兆", "百兆", "千兆")
//单位设置
binding.tag.text = unit.getOrNull(amount.toDouble().toLong().toString().length - 1) ?: ""