Java、Android工具整理 - 单位换算

吴均
2023-12-01

在项目中有一些这样的单位换算场景,将10000 转为 1万 … 索性收集一些,统一记录于此 ~

任重而道远,远兮近兮

数字转化:单位为万或亿【Java】

借鉴于此,亲测可用

示例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;
  }
}

长度转化:m、km、cm & 重量转化:t、g、kg

以下方法,尚未亲测

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) ?: ""
 类似资料: