问题描述
/**Tochangethislicenseheader,chooseLicenseHeadersinProjectProperties.*Tochangethistemplatefile,chooseTools|Templates*andopenthetemplateintheeditor.*/packagetest;importjava.util.ArrayList;importjava.util.Collections;importjava.util.Iterator;importjava.util.LinkedHashMap;importjava.util.List;importjava.util.Map;/****@authorAdministrator*/publicclassNianShuZi{/***@paramargsthecommandlinearguments*/staticStringdigit2String(chardigit){Stringread;switch(digit){case'0':return"ling";case'1':return"yi";case'2':return"er";case'3':return"san";case'4':return"si";case'5':return"wu";case'6':return"liu";case'7':return"qi";case'8':return"ba";case'9':return"jiu";default:return"fu";}}publicstaticvoidmain(String[]args){Stringnumber="-11111";//数字必须介于-10^8与10^8之间并不包括二者//Stringnumber=arg[0];if((number.contains("-")&&number.length()>9)||number.length()>8){System.out.println("数字超出范围!");return;}Stringf="";if(number.contains("-")){number=number.substring(1);f="fu";}char[]numbers=number.toCharArray();char[]Digits=newchar[numbers.length];intj=0;for(inti=numbers.length-1;i>=0;i--){Digits[j]=numbers[i];j++;}StringRead[]=newString[numbers.length];booleanzeroFlag=true;for(inti=0;i<Digits.length;i++){if(i==0||i==4){if(Digits[i]!='0'){Read[i]=digit2String(Digits[i]);}else{zeroFlag=false;}}else{if(Digits[i]=='0'){if(zeroFlag==true){Read[i]=digit2String(Digits[i]);zeroFlag=false;}}else{Read[i]=digit2String(Digits[i]);zeroFlag=true;}}}Map<Integer,String>m=newLinkedHashMap<Integer,String>();Map<Integer,String>wm=newLinkedHashMap<Integer,String>();for(inti=0;i<Read.length;i++){if(Read[i]!=null){if(i<4){m.put(i,Read[i]);}else{wm.put(i%4,Read[i]);}}}Strings=toMankind(m);StringBuildersb=newStringBuilder();if(!wm.isEmpty()){Stringws=toMankind(wm)+"wan";List<String>wes=newArrayList<String>();for(Integeri:wm.keySet()){wes.add(wm.get(i));}Collections.reverse(wes);Iteratorit=wes.iterator();while(it.hasNext()){sb.append("");sb.append(it.next());}sb.append("wan");}List<String>mes=newArrayList<String>();for(Integeri:m.keySet()){mes.add(m.get(i));}Collections.reverse(mes);Iteratoritm=mes.iterator();while(itm.hasNext()){sb.append("");sb.append(itm.next());}System.out.println(f+""+sb.toString().trim());}staticStringtoMankind(Map<Integer,String>m){intlog=0;for(Integeri:m.keySet()){log++;if(!m.get(i).equals("ling")){if(i==1){m.put(i,(m.get(i).equals("yi")&&log==m.size())?"shi":m.get(i)+"shi");}elseif(i==2){m.put(i,m.get(i)+"bai");}elseif(i==3){m.put(i,m.get(i)+"qian");}}}returnm.toString();}}
运行结果:fuyiwanyiqianyibaiyishiyi
解决方案
本帖最后由 skyhitnow 于 2015-01-09 16:02:10 编辑
解决方案二:
我还以为是可以发声的那种
解决方案三:
String[11]chinese={"ling","yi",...,"shi","fu"};Strings="-12345";char[]carr=s.toCharArray();for(charc:carr){//判断是否是负号,是的话用chinese[10],不是的话直接作为下标取chinese数组值使用}
解决方案四:
引用2楼u012171905的回复:
String[11]chinese={"ling","yi",...,"shi","fu"};Strings="-12345";char[]carr=s.toCharArray();for(charc:carr){//判断是否是负号,是的话用chinese[10],不是的话直接作为下标取chinese数组值使用}
没考虑位数,脑补失败
解决方案五:
基本算法已定,发声读出来也不难
解决方案六:
String[11]chinese={"ling","yi",...,"shi","fu"};String[4]weishu={"wan","qian","bai","shi"};Strings="-12345";char[]carr=s.toCharArray();for(inti=0;i<carr.length;i++){System.out.println(digitToCn(carr[i])+weishu[i]);}大致示意如此:)
解决方案七:
谁写一个正确而优雅的,分给谁~(我的结果是正确的)注意是人类读法:比如1000读作yiqian而不是yiqianlingbailingshiling还有好多条件自己想吧
解决方案八:
在10年前的时候,当时用vc开发一个语音导航的项目,那时候不像现在有各种tts组件可以实现。播报文字tts就是这么合成的,把0-10,百、千、万、元、等先录好音编辑成一个一个文件,然后一个一个拼出来的。