在金融项目中,常常需要对金额进行转换,阿拉伯数字转换成中国传统形式。人民币保留到分。
如输入: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("零[角分]", "");
}