import java.math.BigDecimal;public class Misc { //中文金额单位数组
final static String[] straChineseUnit = {"分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟"};
//中文数字字符数组(大写)
final static String[] straChineseNumber = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
//中文数字字符数组(小写)
final static String[] straChineseNumberSimple = {"〇", "一", "二", "三", "四", "五", "六", "七", "八", "九"};    /**
    * Description   将数字金额转换为中文金额
    * @param        <p>BigDecimal bigdMoneyNumber 转换前的数字金额</P>
    * @return       String
    调用:myToChineseCurrency("101.89")="壹佰零壹圆捌角玖分"
    myToChineseCurrency("100.89")="壹佰零捌角玖分"
    myToChineseCurrency("100")="壹佰圆整"
    */
private static String DoNumberCurrencyToChineseCurrency(BigDecimal bigdMoneyNumber,String[] ChineseNumber) {
        String strChineseCurrency = "";
        //零数位标记
        boolean bZero = true;
        //中文金额单位下标
        int ChineseUnitIndex = 0;        //DoPrintMessage("Calling Method DoNumberCurrencyToChineseCurrency");        try {
            if (bigdMoneyNumber.doubleValue() == 0)
                return "零元整";            //处理小数部分,四舍五入
            double doubMoneyNumber = Math.round(bigdMoneyNumber.doubleValue() * 100);            //是否负数
            boolean bNegative = doubMoneyNumber < 0;            //取绝对值
            doubMoneyNumber = Math.abs(doubMoneyNumber);            //循环处理转换操作
            while (doubMoneyNumber > 0) {
                //整的处理(无小数位)
                if (ChineseUnitIndex == 2 && strChineseCurrency.length() == 0)
                    strChineseCurrency = strChineseCurrency + "整";                //非零数位的处理
                if (doubMoneyNumber % 10 > 0) {
                    strChineseCurrency = ChineseNumber[(int)((long)doubMoneyNumber % 10)] + straChineseUnit[ChineseUnitIndex] + strChineseCurrency;
                    bZero = false;
                }
                //零数位的处理
                else {
                    //元的处理(个位)
                    if (ChineseUnitIndex == 2 ) {
                        //段中有数字
                        if (doubMoneyNumber > 0) {
                            strChineseCurrency = straChineseUnit[ChineseUnitIndex] + strChineseCurrency;
                            bZero = true;
                        }
                    }
                    //万、亿数位的处理
                    else if (ChineseUnitIndex == 6 || ChineseUnitIndex == 10) {
                        //段中有数字
                        if (doubMoneyNumber % 1000 > 0)
                            strChineseCurrency = straChineseUnit[ChineseUnitIndex] + strChineseCurrency;
                    }                    //前一数位非零的处理
                    if (!bZero)
                        strChineseCurrency = ChineseNumber[0] + strChineseCurrency;                    bZero = true;
                }                doubMoneyNumber = Math.floor(doubMoneyNumber / 10);
                ChineseUnitIndex ++;
            }            //负数的处理
            if (bNegative)
                strChineseCurrency = "负" + strChineseCurrency;
        }
        catch (Exception e) {
            //DoPrintMessage("Exception Reason  : Call Method DoNumberCurrencyToChineseCurrency Error");
            //DoPrintMessage("Exception Message : " + e.getMessage());
            e.printStackTrace();            return "";
        }        return strChineseCurrency;
    } /**
 * 将金额数值转换成大写人民币形式
 * @param n 金额数值
 * @return String,大写人民币形式
 */
public static String CapitalMoney(double n) {
return DoNumberCurrencyToChineseCurrency(new BigDecimal(n), straChineseNumber);
}

public static void main(String[] args) {
double[] test_data={
17601432, //壹仟柒佰陆拾万壹仟肆佰叁拾贰元整
10001432 //壹仟万(零)壹仟肆佰叁拾贰元整
};
System.out.println(Misc.CapitalMoney(test_data[0]));
System.out.println(Misc.CapitalMoney(test_data[1]));

}
}控制台出的结果是:壹仟柒佰陆拾零万壹仟肆佰叁拾贰元整
                 壹仟零壹仟肆佰叁拾贰元整
能帮我找出错误的原因吗?  要怎么修改..

解决方案 »

  1.   


    //万、亿数位的处理
      else if (ChineseUnitIndex == 6 || ChineseUnitIndex == 10) {
      //段中有数字
      if (doubMoneyNumber % 1000 > 0)
      strChineseCurrency = straChineseUnit[ChineseUnitIndex] + strChineseCurrency;
      }
    copy代码跑了一下,把这个if (doubMoneyNumber % 1000 > 0)条件去掉条件中的语句保留,ChineseUnitIndex 等于6或10就表示段中有数字了。
      

  2.   

    import java.util.ArrayList;
    import java.util.List;public class NumberToChange {  
        private final static String[] CN_Digits = { "零", "壹", "貳", "叁", "肆", "伍",  
                "陆", "柒", "捌", "玖", };  
      
        /** 
         * 将数字型货币转换为中文型货币 <br/> 
         * 参数:<br/> 
         *  
         * @param moneyValue 
         *             字符串形式的金额,小数部分,将多于3位部分舍去,不做四舍五入 
         * @return 
         */  
        public static String CNValueOf(String moneyValue) {  
            //使用正则表达式,去除前面的零及数字中的逗号  
            String value = moneyValue.replaceFirst("^0+", "");  
            value = value.replaceAll(",", "");  
            //分割小数部分与整数部分  
            int dot_pos = value.indexOf('.');
            String int_value;//整数部分  
            String fraction_value;//小数部分        if (dot_pos == -1) {  
                int_value = value;  
                fraction_value = "00";  
            } else {  
                int_value = value.substring(0, dot_pos);  
                fraction_value = value.substring(dot_pos + 1, value.length())  
                        + "00".substring(0, 2);//也加两个0,便于后面统一处理  
            }  
      

  3.   

     
            int len = int_value.length();  
            if (len>16) return "值过大";  
            StringBuffer cn_currency = new StringBuffer();  
            String[] CN_Carry = new String[] { "", "万", "亿", "万亿" };  
            //数字分组处理,计数组数  
            int cnt = len/4+(len%4==0?0:1);  
            //左边第一组的长度  
            int partLen = len-(cnt-1)*4;  
            String partValue=null;  
            boolean bZero=false;//有过零  
            List<Boolean> lastZero = new ArrayList<Boolean>();
            lastZero.add(new Boolean(false));
            String curCN=null;  
            for(int i =0; i<cnt; i++){  
                partValue = int_value.substring(0,partLen);  
                int_value=int_value.substring(partLen);  
                String last = partValue.substring(partLen - 1);
                curCN = Part2CN(partValue,i!=0&&!"零".equals(curCN), lastZero);
                //检查当前的最后一位是否为零,如果是的话把lastZero设置为true
                if(Integer.valueOf(last) == 0){
                 lastZero.add(new Boolean(true));
                }else{
                 lastZero.add(new Boolean(false));
                }
                //System.out.println(partValue+":"+curCN);  
                //若上次为零,这次不为零,则加入零            
                if(bZero && !"零".equals(curCN)){  
                    cn_currency.append("零");  
                    bZero=false;  
                }  
                if("零".equals(curCN))bZero=true;  
                //若数字不是零,加入中文数字及单位  
                if(!"零".equals(curCN)){  
                    cn_currency.append(curCN);  
                    cn_currency.append(CN_Carry[cnt-1-i]);  
                }  
                //除最左边一组长度不定外,其它长度都为4  
                partLen=4;  
                partValue=null;  
            }  
            cn_currency.append("元");  
            //处理小数部分  
            int fv1 = Integer.parseInt(fraction_value.substring(0,1));  
            int fv2 = Integer.parseInt(fraction_value.substring(1,2));  
            if(fv1+fv2==0){  
                cn_currency.append("整");  
            }  
      

  4.   

          else{
             if(fv1 != 0){
             cn_currency.append(CN_Digits[fv1]).append("角");  
             }else{
             cn_currency.append("零");
             }
            
             if(fv2 != 0){
             cn_currency.append(CN_Digits[fv2]).append("分");  
             }
            }  
            return cn_currency.toString();  
        }  
      
        /** 
         * 将一组数字(不多于四个)转化成中文表示 <br/> 
         * 作者:penggl 时间:2011-12-01 下午07:41:25<br/> 
         * 参数:<br/> 
         * @param partValue 字符串形式的数字 
         * @param bInsertZero 是否在前面添加零 
         * @return 
         */  
        private static String Part2CN(String partValue,boolean bInsertZero, List<Boolean> lastZero) {  
            //使用正则表达式,去除前面的0  
            partValue = partValue.replaceFirst("^0+", "");  
            int len = partValue.length();  
            if (len == 0)  
                return "零";  
            StringBuffer sbResult = new StringBuffer();
            if(lastZero.remove(0).booleanValue()){
             sbResult.append("零");
            }
            int digit;  
            String[] CN_Carry = new String[] { "", "拾", "佰", "仟" };  
            for (int i = 0; i < len; i++) {  
                digit = Integer.parseInt(partValue.substring(i, i + 1));  
                if (digit != 0) {  
                    sbResult.append(CN_Digits[digit]);  
                    sbResult.append(CN_Carry[len - 1 - i]);  
                } else {  
                    // 若不是最后一位,且下不位不为零,追加零  
                    if (i != len - 1  
                            && Integer.parseInt(partValue.substring(i + 1, i + 2)) != 0)  
                        sbResult.append("零");  
                }  
            }  
            if(bInsertZero && len!=4)sbResult.insert(0, "零");  
            return sbResult.toString();  
        } 
      

  5.   

    今天抽空看了一下,原计算逻辑应该没问题的,if判断保留,再新增一个方法
     public static String replace(String s) {
            if (s == null || s.isEmpty())
                return "";
            //万亿冗余去重,有先后顺序
            if (s.contains("亿万"))
                return s.replace("亿万", "亿");
            else if (s.contains("亿零万"))
                return s.replace("亿零万", "亿");
            else if (s.contains("零万"))
                return s.replace("零万", "万");
            //测试了近10组数据,只想到这几种情况,如还有可再加
            return s;
        }计算结果时:System.out.println(replace(Misc.CapitalMoney(test_data[0])));