人名币金额阿拉伯数字转化为中国传统形式JAVA实现

在金融项目中,常常需要对金额进行转换,阿拉伯数字转换成中国传统形式。人民币保留到分。

如输入:16700 返回:壹万陆仟柒佰元

如输入:167.5785 返回:壹佰陆拾柒元伍角捌分

(可能用到的汉字参考:零,,,,,,,,,,,,,,亿,兆,元,,.)

分析:

在考虑分数的时候,首先要实现对小数的四舍五入,可以取到要保留小数的下一位数字,判断其是舍还是入。

接下来就是考虑,将数字扩到全是整数,从人名币的最小单位分开始,循环从最低位到高位。最后就是考虑去除掉字符串里面的一些没有意义的翻译,比如100会翻译成,壹佰零拾零元,其中的’零拾‘和‘零元’。这里用replaceAll里面可以使用正则匹配。当然这里还应该有输入参数的合法验证,这里略。

代码实现:

public static String convert(double inputMonney) {
    int decimalDigit = 2;//人名币保留2位小数到分
    //汉语中数字大写
    char[] data = {'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'}; 
    //汉语中货币单位大写,这样的设计类似于占位符
    char[] units = {'分', '角', '元', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟','兆', '拾', '佰', '仟'};
    int uint = 0;
    //在这里我不使用系统函数,自己实现四舍五入,原理:如102.345,保留2位并四舍五入,102.3456->102.3456*10^(2+1)=102345.6->去掉小数部分102345->102345%10=5取到保留小数位数的下一位数字,判断舍入
    long money = (long)(inputMonney * Math.pow(10, decimalDigit + 1));
    if (money % 10 > 4) {
        money = (money / 10) + 1;
    } else {
        money = money / 10;
    }
    StringBuffer sbf = new StringBuffer();
    while (money != 0) {
        sbf.insert(0, units[uint++]);//插入人名币单位
        sbf.insert(0, data[(int) (money % 10)]);//插入单位所对应的值
        money = money / 10;
    }
    //使用replaceAll替换掉“零+'人民币单位'”,replaceAll里面的old字符串可以是正则表达式
    return sbf.toString().replaceAll("零[仟佰拾]", "零").replaceAll("零+万", "万").replaceAll("零+亿", "亿").replaceAll("亿万", "亿零").replaceAll("零+", "零").replaceAll("零元", "元").replaceAll("零[角分]", "");
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值