zoukankan      html  css  js  c++  java
  • Java实现 “ 将数字金额转为大写中文金额 ”

    前言:
        输入数字金额参数,运行程序得到其对应的大写中文金额;例如:输入 12.56,输出 12.56 : 壹拾贰元伍角陆分;重点来了:本人亲测有效。

    奉上代码:
    /**
    * @Title: ConvertUpMoney
    * @Description: 将数字金额转换为大写中文金额
    * @date: 2019年6月18日 下午10:52:27
    */
    public class ConvertUpMoney {

    // 大写数字
    private static final String[] NUMBERS = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
    // 整数部分的单位
    private static final String[] IUNIT = {"元","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","万","拾","佰","仟"};
    // 小数部分的单位
    private static final String[] DUNIT = {"角","分","厘"};


    /**
    * 转换为大写的中文金额
    * @param str 字符串类型的 金额数字
    * @return
    */
    public static String toChinese(String str) {
    // 判断输入的金额字符串是否符合要求
    if (StringUtils.isBlank(str) || !str.matches("(-)?[\d]*(.)?[\d]*")) {
    return "抱歉,请输入数字!";
    }

    if("0".equals(str) || "0.00".equals(str) || "0.0".equals(str)) {
    return "零元";
    }

    // 判断金额数字中是否存在负号"-"
    boolean flag = false;
    if(str.startsWith("-")){
    // 标志位,标志此金额数字为负数
    flag = true;
    str = str.replaceAll("-", "");
    }

    // 去掉金额数字中的逗号","
    str = str.replaceAll(",", "");
    String integerStr;//整数部分数字
    String decimalStr;//小数部分数字

    // 初始化:分离整数部分和小数部分
    if(str.indexOf(".")>0) {
    integerStr = str.substring(0,str.indexOf("."));
    decimalStr = str.substring(str.indexOf(".") + 1);
    }else if(str.indexOf(".")==0) {
    integerStr = "";
    decimalStr = str.substring(1);
    }else {
    integerStr = str;
    decimalStr = "";
    }

    // beyond超出计算能力,直接返回
    if(integerStr.length()>IUNIT.length) {
    return "超出计算能力!";
    }

    // 整数部分数字
    int[] integers = toIntArray(integerStr);
    // 判断整数部分是否存在输入012的情况
    if (integers.length>1 && integers[0] == 0) {
    return "抱歉,输入数字不符合要求!";
    }
    // 设置万单位
    boolean isWan = isWan5(integerStr);
    // 小数部分数字
    int[] decimals = toIntArray(decimalStr);
    // 返回最终的大写金额
    String result = getChineseInteger(integers, isWan) + getChineseDecimal(decimals);
    if(flag){
    // 如果是负数,加上"负"
    return "负" + result;
    }else{
    return result;
    }
    }

    /**
    * 将字符串转为int数组
    * @param number 数字
    * @return
    */
    private static int[] toIntArray(String number) {
    int[] array = new int[number.length()];
    for(int i = 0;i<number.length();i++) {
    array[i] = Integer.parseInt(number.substring(i,i+1));
    }
    return array;
    }

    /**
    * 将整数部分转为大写的金额
    * @param integers 整数部分数字
    * @param isWan 整数部分是否已经是达到【万】
    * @return
    */
    public static String getChineseInteger(int[] integers,boolean isWan) {
    StringBuffer chineseInteger = new StringBuffer("");
    int length = integers.length;
    if (length == 1 && integers[0] == 0) {
    return "";
    }
    for(int i=0; i<length; i++) {
    String key = "";
    if(integers[i] == 0) {
    if((length - i) == 13)//万(亿)
    key = IUNIT[4];
    else if((length - i) == 9) {//亿
    key = IUNIT[8];
    }else if((length - i) == 5 && isWan) {//万
    key = IUNIT[4];
    }else if((length - i) == 1) {//元
    key = IUNIT[0];
    }
    if((length - i)>1 && integers[i+1]!=0) {
    key += NUMBERS[0];
    }
    }
    chineseInteger.append(integers[i]==0?key:(NUMBERS[integers[i]]+IUNIT[length - i -1]));
    }
    return chineseInteger.toString();
    }

    /**
    * 将小数部分转为大写的金额
    * @param decimals 小数部分的数字
    * @return
    */
    private static String getChineseDecimal(int[] decimals) {
    StringBuffer chineseDecimal = new StringBuffer("");
    for(int i = 0;i<decimals.length;i++) {
    if(i == 3) {
    break;
    }
    chineseDecimal.append(decimals[i]==0?"":(NUMBERS[decimals[i]]+DUNIT[i]));
    }
    return chineseDecimal.toString();
    }

    /**
    * 判断当前整数部分是否已经是达到【万】
    * @param integerStr 整数部分数字
    * @return
    */
    private static boolean isWan5(String integerStr) {
    int length = integerStr.length();
    if(length > 4) {
    String subInteger = "";
    if(length > 8) {
    subInteger = integerStr.substring(length- 8,length -4);
    }else {
    subInteger = integerStr.substring(0,length - 4);
    }
    return Integer.parseInt(subInteger) > 0;
    }else {
    return false;
    }
    }


    // Test
    public static void main(String[] args) {
    String number = "12.56";
    System.out.println(number+": "+ConvertUpMoney.toChinese(number));

    number = "1234567890563886.123";
    System.out.println(number+": "+ConvertUpMoney.toChinese(number));

    number = "1600";
    System.out.println(number+": "+ConvertUpMoney.toChinese(number));

    number = "156,0";
    System.out.println(number+": "+ConvertUpMoney.toChinese(number));

    number = "-156,0";
    System.out.println(number+": "+ConvertUpMoney.toChinese(number));

    number = "0.12";
    System.out.println(number+": "+ConvertUpMoney.toChinese(number));

    number = "0.0";
    System.out.println(number+": "+ConvertUpMoney.toChinese(number));

    number = "01.12";
    System.out.println(number+": "+ConvertUpMoney.toChinese(number));

    number = "0125";
    System.out.println(number+": "+ConvertUpMoney.toChinese(number));

    number = "-0125";
    System.out.println(number+": "+ConvertUpMoney.toChinese(number));

    number = "sdw5655";
    System.out.println(number+": "+ConvertUpMoney.toChinese(number));

    System.out.println(null+": "+ConvertUpMoney.toChinese(null));
    }
    }
     

    ————————————————
    版权声明:本文为CSDN博主「木子雷」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/feichitianxia/article/details/92801678

  • 相关阅读:
    Centos 7环境下配置MySQL 5.7读写分离
    Centos 7环境下安装配置MySQL 5.7
    Hadoop 2.8集群安装及配置记录
    ASP.NET Core 1.1版本之Hello word
    Hadoop版Helloworld之wordcount运行示例
    SSH配置免密登陆设置汇总
    最小安装模式下Centos7.*网卡启动配置
    骚扰式管理
    项目团队之分工协作
    利用微软AntiXss Library过滤输出字符,防止XSS攻击
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/12955231.html
Copyright © 2011-2022 走看看