将人民币转换为大写
这是一个能将数字转换为人民币大写的代码。大家是否有更好的方法望大家不吝赐教。
我的方法为:1、先进行整数与小数部分的拆分。
2、分别将整数与小数据部分转换为汉字和所对应的单位
3、将转换完的不规则部分去掉。如:零零、零万。
public class NumToRmb { private String[] hanArr = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌","玖" }; private String[] shuArr = { "0", "1", "2", "3", "4", "5", "6", "7", "8","9" }; private String[] rmbUnit = { "圆", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿","拾", "佰", "仟", "角", "分" }; private int shuArrLen = shuArr.length; // 取出整数部分 private Long zhengNum(double num) { long zheng = (long) num; return zheng; } // 取出小数部分 private long xiaoNum(double num) { long xiao = Math.round((num - zhengNum(num)) * 100); return xiao; } // 将输入的人民币金额转换成汉字 public String toHanStr(double num) { // 得到整数部分 long zheng = zhengNum(num); // 得到小数部分 long xiao = xiaoNum(num); // 这两个变量分别用来存储小数与整数字符串 String zhengStr, xiaoStr; zhengStr = ""; xiaoStr = ""; // 判断是否大于零否则不予操作,如果需要得到零圆的结果,可以进行更改 if (zheng > 0) { // 进行汉字的转换 zhengStr = toHanZhengStr(zheng + ""); } // 如果小数部分为零则不需要进行汉字转换 if (xiao > 0) { // 进行汉字的转换 xiaoStr = toHanXiaoStr(xiao + ""); } // 将小数与整数连接反回最后结果 return zhengStr + xiaoStr; } /* * 进行汉字转换的核心方法 先将数字依次转换为汉字由@numToHan方法完成 * * 如果是"0"则没有单位否则则添加单位 * * 如果是最后一位(我们的人民币规律四位为一段如《千百十万》、《千百十圆》) * * 则需要带单位如:零圆、零万 用循环将相邻的"零"替换为一个零如:"零零"替换为 "零" * * 再将有可能出现的组合如:"零元" 替换为 "元"、"零万" 替换为 "万"。 * * 注意:"万元" 除外。因为最后需要以"元"结束 * * 最后出来的就是正确的字符 * */ private String toHanZhengStr(String zhengStr) { int zhengLen = zhengStr.length(); String zhengHan = new String(); zhengHan = ""; //循环每一个字符,将对翻译为对应的汉字和单位 for (int i = zhengLen - 1; i >= 0; i--) { zhengHan = (zhengStr.charAt(i) == '0' && "元万亿".indexOf(rmbUnit[zhengLen - 1 - i]) < 0 ? numToHan(zhengStr .charAt(i) + "") : numToHan(zhengStr.charAt(i) + "") + rmbUnit[zhengLen - 1 - i]) + zhengHan; } zhengHan = formatStr(zhengHan); return formatStr(zhengHan); } //进行不规则字符的替换 private String formatStr(String zhengStr) { int aLen = zhengStr.length(); do { aLen = zhengStr.length(); zhengStr = zhengStr.replaceAll("零零", "零"); } while (zhengStr.length() < aLen); zhengStr = zhengStr.replace("零元", "元"); zhengStr = zhengStr.replace("零万", "万"); zhengStr = zhengStr.replace("零亿", "亿"); // zhengStr = zhengStr.replaceAll("万元", "万"); zhengStr = zhengStr.replaceAll("亿万", "亿"); return zhengStr; } /* * 进行小数部分的汉字转换 * * 小数部分较为简单只有两种情况,一种为一位另一种为两位 * * 如果为一位则这位小数单位为"分" * * 如果为两位,则为"角"、"分" * */ private String toHanXiaoStr(String xiaoStr) { String xiaoHan = new String(); xiaoHan = xiaoStr.length() == 1 ? hanArr[0] + numToHan(xiaoStr.charAt(0) + "") + rmbUnit[13] : numToHan(xiaoStr.charAt(0) + "") + rmbUnit[12] + numToHan(xiaoStr.charAt(1) + "") + rmbUnit[13]; xiaoHan = xiaoHan.replace("零分", ""); return xiaoHan; } //将数字翻译成对应的汉字 private String numToHan(String charNum) { for (int j = 0; j < shuArrLen; j++) { if (shuArr[j].equals(charNum)) { return hanArr[j]; } } return ""; } /** * @param args */ public static void main(String[] args) { // TODO 自动生成的方法存根 NumToRmb nr = new NumToRmb(); System.out.println("153685569874.85"); System.out.println(nr.toHanStr(153685569874.85)); } }
浙公网安备 33010602011771号