将人民币转换为大写

这是一个能将数字转换为人民币大写的代码。大家是否有更好的方法望大家不吝赐教。

我的方法为: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));
    }

}

 

posted @ 2013-03-13 11:05  清雅朴韵  阅读(443)  评论(1)    收藏  举报