阿拉伯数字转换为拼音读法
今天同学让看下这个题目,折腾了两个多小时,设计了个巨复杂的算法,漏洞百出。
回来的路上忽然想起来其实很简单啊,贴一下代码。
感叹一下,以后什么都要想好了再动手,那怕什么都不做,光思考了一大半时间,很多时候也比没想清楚急匆匆得开始干好得多。
import java.util.regex.Pattern;public class num2pinyin { public static String numArray[] = {"Ling","Yi","Er","San","Si","Wu","Liu","Qi","Ba","Jiu"}; //int范围到十亿就足够了 public static String pinyinArray[] = {"","Shi","Bai","Qian","Wan","ShiWan","BaiWan","QianWan","Yii","ShiYii"}; public static String Num2pinyin(int input) { StringBuilder sb = new StringBuilder(); char[] nums = String.valueOf(input).toCharArray(); for(int i=0;i<nums.length;i++) { int currentNum = nums[i] - '0'; sb.append(numArray[currentNum]); if(currentNum!=0) sb.append(pinyinArray[nums.length-1-i]); } String rst = sb.toString(); //多个0替换成1个 rst = rst.replaceAll("Ling(Ling)+", "Ling"); //开头的“一十”换成“十” if(rst.startsWith("YiShi")) rst = rst.substring(2); //去掉末尾0 if(rst.length()>4 && rst.endsWith("Ling")) rst = rst.substring(0, rst.length()-4); //出现多个亿的话只保留最后一个 rst = remainLast(rst,"Yii"); //亿后面再出现多个万的话只保留最后一个万 rst = remainLast(rst,"Wan"); return rst; } //str 中删掉所有content,只保留最后一个 public static String remainLast(String str,String content) { while(str.indexOf(content)!=str.lastIndexOf(content)) str=str.replaceFirst(Pattern.quote(content), ""); return str; } /** * @param args */ public static void main(String[] args) { System.out.println(Num2pinyin(0)); System.out.println(Num2pinyin(1)); System.out.println(Num2pinyin(9)); System.out.println(Num2pinyin(15)); System.out.println(Num2pinyin(100)); System.out.println(Num2pinyin(105)); System.out.println(Num2pinyin(115)); System.out.println(Num2pinyin(1001)); System.out.println(Num2pinyin(2000)); System.out.println(Num2pinyin(2100)); System.out.println(Num2pinyin(2010)); System.out.println(Num2pinyin(9999)); System.out.println(Num2pinyin(10000)); System.out.println(Num2pinyin(10001)); System.out.println(Num2pinyin(10010)); System.out.println(Num2pinyin(10100)); System.out.println(Num2pinyin(21000)); System.out.println(Num2pinyin(99999)); System.out.println(Num2pinyin(100000)); System.out.println(Num2pinyin(890909)); System.out.println(Num2pinyin(2200000)); System.out.println(Num2pinyin(2100000000)); }}