金额转大写java实现

package com.phyl.util;
import java.util.HashMap;
/**
 * 数字金额转换成中文大写金额
 * @author ftpeng
 *
 */
public class ChineseConvert {
        
    /**
     * 人民币大写单位制
     */
    private static HashMap<Integer, String> dws;
        
    /**
     * 数字对应的中文
     */
    private static String[] jes;
        
    // 初始化执行
    static{
        dws = new HashMap<Integer, String>();
        dws.put(-2, "分");
        dws.put(-1, "角");
        dws.put(0, "元");
        dws.put(1, "拾");
        dws.put(2, "佰");
        dws.put(3, "仟");
        dws.put(4, "万");//
        dws.put(5, "拾");
        dws.put(6, "佰");
        dws.put(7, "仟");
        dws.put(8, "亿");//
        dws.put(9, "拾");
        dws.put(10, "佰");
        dws.put(11, "仟");
        dws.put(12, "万");
        jes = new String[]{"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
    }
        
    /**
     * 数字转换人民币大写
     * @param number 数字 不支持科学数字
     * @return
     */
    public static String chinese(String number){
        StringBuffer su = new StringBuffer();
        // 整数部分
        number = delInvalidZero(number);
        String str = null;
        // 小数部分
        String decimal = null;
            
        if(number.contains(".")){
            // 截取整数位
            str = number.split("\\.")[0];
            decimal = number.split("\\.")[1];
        }else{
            str = number;
        }
        // 判断是否存在整数位
        if(str.length()>0){
            for (int i = 0; i < str.length() ; i++) {
                String context = str.substring(i, i+1);
                int pow = str.length()-i-1;
                Integer val = Integer.parseInt(context.toString());
                // 获取中文单位
                String sign = dws.get(pow);
                // 获取中文数字
                String name = jes[Integer.parseInt(context)];
                if(val==0){
                    if(pow%4!=0){// 删除单位
                        sign = "";
                    }
                    if(i < str.length()-1){
                        Integer val1 = Integer.parseInt(str.substring(i+1, i+2));
                        if(val==0&&val==val1){
                            name = "";
                        }
                    }else if(i == str.length()-1){
                        name = "";
                    }
                }
                su.append(name+sign);
            }
        }
        // 判断是否存在小数位
        if(decimal!=null){
            str = decimal.substring(0,1);
            if(!"0".equals(str)){
                su.append(jes[Integer.parseInt(str)]+dws.get(-1));
            }
            if(decimal.length()==2){
                str = decimal.substring(1,2);
                if(!"0".equals(str)){
                    su.append(jes[Integer.parseInt(str)]+dws.get(-2));
                }
            }
        }else{
            su.append("整");
        }
        return su.toString();
    }
        
    /**
     * 清理数字特殊字符
     * @param str
     * @return
     */
    private static String delInvalidZero(String str){
        if("0".equals(str.substring(0, 1))){
            return delInvalidZero(str.substring(1, str.length()));
        }else if(str.contains(",")){
            return delInvalidZero(str.replaceAll(",", ""));
        }else{
            return str;
        }
    }
        
    public static void main(String[] args) {
        System.out.println(ChineseConvert.chinese("123456"));
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是Java代码实现金额中文大写: ``` import java.math.BigDecimal; public class MoneyUtil { // 大写数字 private static final String[] CN_UPPER_NUMBER = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; // 整数部分单位 private static final String[] CN_UPPER_INTEGER_UNIT = {"", "拾", "佰", "仟"}; // 小数部分单位 private static final String[] CN_UPPER_FRACTION_UNIT = {"角", "分"}; /** * 将金额换为中文大写 * * @param money 金额,单位为元 * @return 中文大写金额 */ public static String moneyToChinese(BigDecimal money) { if (money == null) { return ""; } StringBuilder sb = new StringBuilder(); // 处理整数部分 long integerPart = money.longValue(); if (integerPart == 0) { sb.append(CN_UPPER_NUMBER[0]); } else { int i = 0; while (integerPart > 0) { int digit = (int) (integerPart % 10); if (digit > 0) { sb.insert(0, CN_UPPER_INTEGER_UNIT[i]); sb.insert(0, CN_UPPER_NUMBER[digit]); } else if (sb.length() > 0 && !sb.substring(0, 1).equals(CN_UPPER_NUMBER[0])) { sb.insert(0, CN_UPPER_NUMBER[digit]); } integerPart /= 10; i++; } } sb.append("元"); // 处理小数部分 int fractionPart = money.movePointRight(2).intValue() % 100; for (int i = 0; i < CN_UPPER_FRACTION_UNIT.length; i++) { int digit = fractionPart % 10; if (digit > 0) { sb.append(CN_UPPER_NUMBER[digit]); sb.append(CN_UPPER_FRACTION_UNIT[i]); } else if (i == 0 && sb.length() > 0 && !sb.substring(sb.length() - 1).equals("元")) { sb.append(CN_UPPER_NUMBER[digit]); } fractionPart /= 10; } if (sb.length() == 2) { sb.append("整"); } return sb.toString(); } } ``` 使用示例: ``` BigDecimal money = new BigDecimal("1234567.89"); String chinese = MoneyUtil.moneyToChinese(money); System.out.println(chinese); // 壹佰贰拾叁万肆仟伍佰陆拾柒元捌角玖分 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值