最近近做了阿里的笔试题,将数字转成中文进行朗读,数字较小时直接朗读,而当数字较大时,我们希望朗读的更人性化一点,会在中间稍微停顿。
注意:数字不会超过万亿。
通过中文逗号来表达一个停顿,根据朗读习惯,一次朗读的中文数字最好不要大于8个字,否则就建议增加一个停顿。
解题思路:
第一步、先不考虑加逗号,直接把阿拉伯数字转换成中文数字。这很简单。
第二步、转换完成后,发现根据中文数字的朗读习惯,有些零可以去掉,则去掉多余的零。
第三步、最后考虑特殊的情况,一十,一十万,一十亿在中文数字里不读前面的一。
接下来直接上代码:
import java.util.Scanner; /** * 18-4-11 * @author hsy * */ public class Alibaba1 { public static void main(String[] args){ Scanner in = new Scanner(System.in); String res; String input = in.nextLine().trim(); String[] s ={"","十","百","千"}; String[] w = {"零","一","二","三","四","五","六","七","八","九"}; String[] v = {"个","万","亿","万亿"}; int index = 0; String[] resStr = new String[3]; String tran = ""; for(int i=input.length()-1;i>=0;i--){ int p = input.length()-i-1; String x = input.substring(p,p+1); int m = Integer.parseInt(x); tran += w[m]; //i 不在个位 if(i%4!=0 && m!=0) tran += s[i%4];//百千 if(i%4==0) tran+= v[i/4];//万亿 index++; } // System.out.println(tran); StringBuilder sb=new StringBuilder(tran); if(tran.contains("零") ){ //个,万,亿前面的零删掉 for(int i=sb.length()-1;i>=1;i--){ char a = sb.charAt(i); char b = sb.charAt(i-1); // char c = sb.charAt(i-2); //个,万,亿前面的零删掉 if(a=='个'||a=='万'||a=='亿'){ if(b=='零'){ sb.delete(i-1, i); } } } //剩下相邻的零也删掉 for(int i=sb.length()-1;i>=1;i--){ char a = sb.charAt(i); char b = sb.charAt(i-1); if(a=='零' && b=='零'){ sb.delete(i-1, i+1); break; } } } //去掉个 sb.deleteCharAt(sb.length()-1); //判断开头是不是一十,如果是改成十 if(sb.charAt(0)=='一' && sb.charAt(1)=='十') sb.deleteCharAt(0); System.out.println(sb.toString()); //中文数字小于8,直接读,大于8,得用括号分开 if(sb.length()<=8) System.out.println(sb.toString()); else{ StringBuilder newSb =new StringBuilder(); for(int i=0;i<sb.length();i++){ char c = sb.charAt(i); newSb.append(c); //亿、万,断开 if(c=='亿'||c=='万') newSb.append(','); } String[] str = newSb.toString().split(","); //如果万,个 加起来不超过8,则不打逗号 if(str[1].length()+str[2].length()<=8) System.out.println(str[0]+","+str[1]+str[2]); //否则全打逗号 else System.out.println(newSb.toString()); } } }