MyException - 我的异常网
当前位置:我的异常网» J2SE » 多谢 急 金额转换,阿拉伯数字的金额转换成中国传统

多谢 急 金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出(2)

www.MyException.Cn  网友分享于:2013-11-29  浏览:499次

else if ((length - i) == 1)// 元(必填)
key = IUNIT[0];
// 0遇非0时补零,不包含最后一位
if ((length - i) > 1 && integers[i + 1] != 0)
key += NUMBERS[0];
}
chineseInteger.append(integers[i] == 0 ? key
: (NUMBERS[integers[i]] + IUNIT[length - i - 1]));
}
return chineseInteger.toString();
}

/**
* 得到中文金额的小数部分。
*/
private static String getChineseDecimal(int[] decimals) {
StringBuffer chineseDecimal = new StringBuffer("");
for (int i = 0; i < decimals.length; i++) {
// 舍去3位小数之后的
if (i == 3)
break;
chineseDecimal.append(decimals[i] == 0 ? ""
: (NUMBERS[decimals[i]] + DUNIT[i]));
}
return chineseDecimal.toString();
}

/**
* 判断第5位数字的单位"万"是否应加。
*/
private static boolean isMust5(String integerStr) {
int length = integerStr.length();
if (length > 4) {
String subInteger = "";
if (length > 8) {
// 取得从低位数,第5到第8位的字串
subInteger = integerStr.substring(length - 8, length - 4);
} else {
subInteger = integerStr.substring(0, length - 4);
}
return Integer.parseInt(subInteger) > 0;
} else {
return false;
}
}

public static void main(String[] args) {
String number = "1.23";
System.out.println(number + " " + MoneyUtil.toChinese(number));
number = "1234567890123456.123";
System.out.println(number + " " + MoneyUtil.toChinese(number));
number = "0.0798";
System.out.println(number + " " + MoneyUtil.toChinese(number));
number = "10,001,000.09";
System.out.println(number + " " + MoneyUtil.toChinese(number));
number = "01.107700";
System.out.println(number + " " + MoneyUtil.toChinese(number));
}

}
------解决方案--------------------
答:我也来提供一个。其实就是一个循环就行了。也不需要什么repalceAll(),,也不需要区分什么整数部分与小数部分。不必要的。
Java code

import java.math.*;
public class TestTrans {
    private static final String NUM="零壹贰叁肆伍陆柒捌玖";
    private static final String UNIT="亿仟佰拾万仟佰拾元角分厘毫";//13位
    private static final String EX_UNIT="亿拾佰仟万";
    
    //将数值串转换成大写金额:一个循环就行了
    //若数值串非法,则返回:null
    public static String toCapNumber(String data)
    {
        String s=checkValue(data);
        if(s==null){return null;}//数值串非法
        if(s.charAt(0)=='0'){return "零元整";}
        String rs="";//最终结果串
        boolean hasZero=false;//有零没有输出,则置为true
        int i=0,sLen=s.length(),uLen=UNIT.length();
        int pos=uLen-sLen+i;//i所对应的单位串中的位置
        for(;i<sLen;i++,pos++)//一个循环,即求出所有的大写金额串
        {
            if(s.charAt(i)=='0')//若是字符'0'
            {
                hasZero=true;
                if(isUnit(i,sLen))//若对应单位是'亿'、万、元,则输出。
                {
                    String u=getUnit(i, sLen);
                    if(u.endsWith("亿")&&!rs.endsWith("亿")||
                       u.endsWith("万")&&!rs.endsWith("亿")||
                       u.endsWith("元")    )
                    {
                     rs=rs+getUnit(i, sLen);//将单位输出
                     hasZero=false;
                    }
                }
            }
            else
            {//不是'0'
                if(hasZero){rs=rs+"零";hasZero=false;}
                rs=rs+NUM.charAt(s.charAt(i)-'0')+getUnit(i, sLen);
            }
        }//for(i) 大写金额转换结束
        
        if("分厘毫".indexOf(rs.charAt(rs.length()-1))==-1)//补整
        {
            rs=rs+"整";
        }
        return rs;
    }//大写金额转换结束
        
    //检查数值串。不正确返回null。否则返回整数值串(小数点向右移4位)
    private static String checkValue(String data)
    {
        BigDecimal bd=null;
        BigInteger bi=null;        
        try{
         bd=new BigDecimal(data,MathContext.DECIMAL128).movePointRight(4);
        }catch(NumberFormatException e){ return null;}
        bi=(bd.add(new BigDecimal(0.5))).toBigInteger();
        return bi.toString();
    }
    //当前位置对应的单位若是亿、万、元,则返回true
    private static boolean isUnit(int pos,int len)
    {
        String u=getUnit(pos, len);
        return u.endsWith("亿")||u.endsWith("万")||u.endsWith("元");
    }
    //返回当前位置对应的单位
    private static String getUnit(int pos,int len)
    {
        int upos=UNIT.length()-len+pos;
        if(upos<0)
        {
            upos=-upos;
            if(upos%5==0){ return getStr(upos/5);}
            return ""+EX_UNIT.charAt(upos%5);
        }
        return ""+UNIT.charAt(upos);
    }
    //返回:亿、亿亿、亿亿亿、亿亿亿亿、。。。。。
    private static String getStr(int i)
    {
        StringBuilder sb=new StringBuilder("亿");
        for(int j=1;j<=i;j++)
        {
            sb.append('亿');
        }
        return sb.toString();
    }
    
    public static void main(String[] args) {
        System.out.println("0.000=>"+toCapNumber("0.000"));
        System.out.println("0.50000=>"+toCapNumber("0.50000"));
        System.out.println("0.056478154e3=>"+toCapNumber("0.056478154e3"));
        System.out.println("2000300004000.5600=>"+toCapNumber("2000300004000.5600"));
        System.out.println("30000000002000000000.234=>"+toCapNumber("30000000002000000000.234"));
    }

}

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有