Integer to English Words:将数字转换成英文拼写

Convert a non-negative integer to its english words representation. Given input is guaranteed to be less than 231 - 1.

For example,

123 -> "One Hundred Twenty Three"
12345 -> "Twelve Thousand Three Hundred Forty Five"
1234567 -> "One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven"

思路:这道题到是不难,主要是格式转换太麻烦了!!!就针对空格的位置,我试了好久。。。。

思路是从数字从后向前分割,以三个数字为一组,对每一组进行判断。注意英文语法里1 - 19 的语法不同。

还有就是空格位置,我就是一开始没想明白,然后一点一点试出来的,痛心疾首啊.....

class Solution {
    HashMap<Integer,String> B;//较大的单位,如千,百万等..
    HashMap<Integer,String> M;//中等级别的单位,如11,12 等
    HashMap<Integer,String> S;//最小级别的单位,如1 - 9
    
    public void init(){
        B = new HashMap<Integer,String>();
        B.put(0,"");
        B.put(1," Thousand");
        B.put(2," Million");
        B.put(3," Billion");
        
        M = new HashMap<Integer,String>();
        M.put(0,"");
        M.put(1,"One");
        M.put(2,"Two");
        M.put(3,"Three");
        M.put(4, "Four");
        M.put(5,"Five");
        M.put(6,"Six");
        M.put(7,"Seven");
        M.put(8,"Eight");
        M.put(9,"Nine");
        M.put(10,"Ten");
        M.put(11,"Eleven");
        M.put(12,"Twelve");
        M.put(13,"Thirteen");
        M.put(14,"Fourteen");
        M.put(15,"Fifteen");
        M.put(16,"Sixteen");
        M.put(17,"Seventeen");
        M.put(18,"Eighteen");
        M.put(19,"Nineteen");
        M.put(20,"Twenty");
        M.put(30,"Thirty");
        M.put(40,"Forty");
        M.put(50,"Fifty");
        M.put(60,"Sixty");
        M.put(70,"Seventy");
        M.put(80,"Eighty");
        M.put(90,"Ninety");
        M.put(100,"Hundred");
        
        S = new HashMap<Integer,String>();
        S.put(0,"");
        S.put(1,"One");
        S.put(2,"Two");
        S.put(3,"Three");
        S.put(4,"Four");
        S.put(5,"Five");
        S.put(6,"Six");
        S.put(7,"Seven");
        S.put(8,"Eight");
        S.put(9,"Nine");       
    }
    
    public String numberToWords(int num) {
        if(num == 0) return "Zero";
        init();
        int seg = 1;
        ArrayList<String> res = new ArrayList<String>();//保存每三个数字组成的一组数字
        StringBuilder sb = new StringBuilder();
        int b = 0;//控制较大单位使用
        String nums = num +"";
        int r = nums.length()-1;
        while(r >= 0){
        	int l = (r - 2 > 0)?(r - 2):0;
        	int sub = Integer.parseInt(nums.substring(l, r+1));//subString是前闭后开区间,所以r+1
            num = num / seg * seg;
            if(sub >= 100){//百位
                int m = sub / 100 ; 
                sb.append(S.get(m)+" Hundred");
                sub = sub % 100;
            }
            if(sub != 0) sb.append(" ");
            if(sub < 20 ){//十位
                sb.append(M.get(sub));
                sub = 0;
            }else{
                int m = sub / 10 * 10;
                sb.append(M.get(m));
                sub = sub % 10;
            }
            if(sub != 0) sb.append(" ");
            sb.append(S.get(sub));//个位   	
            if(Integer.parseInt(nums.substring(l, r+1))!=0){//保证1000000这种不会出现one Billion thousand 这种情况
            	sb.append(B.get(b));
            }
            b++;//控制thousand、million、billion的位置
            res.add(sb.toString().trim());
            sb.setLength(0);
            r = r - 3;//每三个数字为一组
        }
        sb.setLength(0);
        for(int i = res.size() - 1;i>=0; i--){       	
            sb.append(res.get(i).trim());
            if(i != 0&&res.get(i).length()!=0) sb.append(" ");
        }
        return sb.toString().trim();
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值