输入十进制数字,中文大写数字的形式读出
為什么80%的碼農都做不了架構師?>>> ??
今天面試,面試官給我出了一個編程題:
?? ?完成方法,輸入十進制數字,按人們讀出數字的形式讀出。(例:輸入 2016 輸出:貳仟零壹拾陸)
?? ?標準大寫數字:零、壹、貳、叁、肆、伍、陸、柒、捌、玖、拾、佰、仟、萬、億
接到題后,以為沒什么難的,沒考慮太多,最后寫出來跟渣一樣,還有bug。。。
當時寫的代碼是這樣(這個代碼是反面教材,正確的在后面):
String[] v = {"萬","千","百","十"};String[] p = {"零","一","二","三","四","伍","六","七","八","九","十"};public String getSinfo(int input){int count = (input+"").length();StringBuffer sb = new StringBuffer();if(count > 5){String supString = getSinfo(input/10000);sb.append(supString.substring(0,supString.length()-1));System.out.println(input/10000 + " " + supString);input = input%100000;}ArrayList<String> nums = new ArrayList<>();ArrayList<String> vs = new ArrayList<>();int vl = v.length;for(int i = 0 ; i < count ; i++){int r = input%10;nums.add(p[r]);input = input/10;if(i > 0){if(r != 0){vs.add(v[vl-i]);}else{vs.add("");}}}Collections.reverse(nums);Collections.reverse(vs);int nl = nums.size();for(int i = 0 ; i < nl ; i++){sb.append(nums.get(i));if(i < nl - 1){sb.append(vs.get(i));}}return sb.toString();}? ?然后,輸入12345678,輸出的是:一千二百三十零零零四萬伍千六百七十八
尷尬,丟人!!! ?于是深夜好好完成一下這個方法。
首先,要整理一下人們讀數字的幾個規則。讀數字大家都會,但是不列出來的話,編程中很容易遺漏一些需要注意的地方。
讀讀字的規則:
?? ?1,數字結尾無論多少個0,都省略不讀。
?? ?2,數位中間無論多少個0,都讀成一個“零”,
?? ?3,計數單位有個、十、百、千、萬、十萬、百萬、千萬、億,十億、百億、千億。。。。
?? ?4,10至19以及以這些數字開頭的萬級、億級數字,以“十”開頭,如十五,十萬,十億等。兩位數以上,在數字中部出現,則用「一十幾」,如一百一十,一千零一十,一萬零一十等。
?? ?5,20至29以及以這些數字開頭的萬級、億級數字,以“二”開頭,如二十五,二十萬,二十億等,其它在2作開頭時,可以讀成“兩”。
總結讀法規律:
?? ?1,四位數的讀法為基礎,萬以上億以內,億以上的,讀法與四位數讀法相同,不過是在結尾加上“萬”,或者“億”。程序中可分組處理。
?? ?2,對于“萬”,“億”,是交替出現的,程序中可根據奇偶數選擇添加。
綜上寫出四位數及其以下讀法:
/*** 四位數及其以下讀法* @param number* @return*/private String getStringForNumberUnit(int number){String strNumber = number+"";int sum = strNumber.length();if(sum > 4){throw new IllegalArgumentException("Digital unit number greater than 4 !");}ArrayList<Integer> nums = new ArrayList<>();ArrayList<String> bigNums = new ArrayList<>();for(int i = 0 ; i < sum ; i++){int currentNum = number%10;nums.add(currentNum);if(currentNum == 0){//添加零的時機選在,最后一個零的時候if(i != 0 && nums.get(i-1) != 0){//不是首位,并且下一個不是0的時候才添加"零"bigNums.add(bigNumbers[currentNum]);}else {//否則添加空字符串占位,以便后面拼接時候統一bigNums.add("");}}else{bigNums.add(bigNumbers[currentNum]);}number = number/10;}StringBuffer sb = new StringBuffer();for (int i = sum - 1 ; i >= 0 ; i--){sb.append(bigNums.get(i));if(i > 0 && nums.get(i) != 0){//不是個位,而且不為0,才需要添加單位sb.append(bigUnits[i-1]);//添加單位,十百千}}return sb.toString();}
寫出添加“萬”,“億”的方法:
另,類中兩個數組:
? ? private String[] bigNumbers = {"零","壹","貳","叁","肆","伍","陸","柒","捌","玖"};private String[] bigUnits = {"拾","佰","仟","萬","億"};主方法中只有一行代碼:
??
測試:
?? ?輸入 1200567800
?? ?輸出 壹拾貳億零伍拾陸萬柒仟捌佰
搞定!!!
都寫完之后,發現確實有點不容易。。。不過細心點還是可以完成的。
本文原地址:https://my.oschina.net/reone/blog/776267
轉載于:https://my.oschina.net/reone/blog/776267
總結
以上是生活随笔為你收集整理的输入十进制数字,中文大写数字的形式读出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件框架-无绪开发5
- 下一篇: 大数据技术有哪些应该重点学哪些知识