将数字转化成汉字

/**
 * 将数字转化成汉字 传入参数字符串不可为"0",字符串第一个字符为"0"时,不会被解析。  
 * @author toplion
 *
 */
public final class NumberTransfrom {
    
    private  static String[] unms = new String[] { "零","一","二","三","四","五","六","七","八","九" };
    private static  String[] digits = new String[] { "","十","百","千" };
    private  static String[] units = new String[] { "","万","亿","万亿" };
    
    public  NumberTransfrom()
    {
    }
    public  NumberTransfrom( String[] nums, String[] digits, String[] units )
    {
        this.unms = nums;
        this.digits = digits;
        this.units = units;
    }
    public void setUnits( String[] units )
    {
        this.units = units;
    }
    public void setNums( String[] nums )
    {
        this.unms = nums;
    }
    public void setDigits( String[] digits )
    {
        this.digits = digits;
    }
    
    //检查字符串s是否全为数字
    public boolean checkIsNumbers( String x )
    {
        if (null == x)
        {
            return false;
        }
        for( Character c: x.toCharArray() )
        {
            if(c.compareTo('0')<0 || c.compareTo('9')>0)
            {
                return false;
            }
        }
        return true;
    }
    
    public String transfrom( String x )
    {
        if( null==x )
        {
            return "您输入的字符串地址为null!";
        }
        if( 0==x.length() )
        {
            return "您输入的字符串长度为0,请输入要转换的数字!";
        }
        if( false==checkIsNumbers(x) )
        {
            return "您输入的字符不都为数字,无法转换!";
        }
        if( x.length()>16 )
        {
            return "您输入的字符串长度大于16,无法转换!";
        }
        //去除字符串首部的0,例如:0010->10
        int fm;
        for( fm=0 ; fm<x.length() ; fm++ )
        {
            if ( x.charAt(fm)!='0')
            {
                break;
            }
        }
        x = x.substring(fm);//去除完毕
        
        //把字符串看作一些组,例如:123456789->1,2345,6789
        String result = "";
        int p = 0;
        int m = x.length()%4; 
        int k = ( m>0 ? x.length()/4+1 : x.length()/4 );
        //从最左边的那组开始,向右循环
        for( int i=k; i>0; i-- )
        {
            int len=4;
            if ( i==k && m!=0 )//当i为最左边的那组时,组长度可能有变化
            {
                len=m;
            }
            String s = x.substring( p, p+len );
            int le = s.length();
            for( int j=0; j<le; j++ )
            {
                int n = java.lang.Integer.parseInt( s.substring(j,j+1) );
                if ( 0==n )
                {
                    if(j<le-1 && java.lang.Integer.parseInt(s.substring(j+1,j+2))>0 && !result.endsWith(unms[0]))
                    {//加零的条件:不为最后一位 && 下一位数字大于0 && 以前没有加过“零”
                        result += unms[0];
                    }
                }
                else
                {
                    if( !(n==1 && (result.endsWith(unms[0])||result.length()==0) && j==le-2) )
                    {//处理1013一千零"十三",1113 一千一百"一十三"
                        result += unms[n];
                    }
                    result += digits[le-j-1];
                }
            }
            if ( 0!=java.lang.Integer.parseInt(s) )//如果这组数字不全是 0 ,则加上单位:万,亿,万亿
            {
                result += units[i-1];
            }
            p += len;
        }
        return result;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVA代码搬运工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值