日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

输入十进制数字,中文大写数字的形式读出

發布時間:2023/12/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 输入十进制数字,中文大写数字的形式读出 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么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();}


寫出添加“萬”,“億”的方法:

/*** 添加萬億單位,拿到最終結果* @param number* @return*/private String getStringForNumber(int number){String strNumber = number+"";int count = strNumber.length() / 4 +1;//四個一組進行讀法解析StringBuffer sb = new StringBuffer();for(int i = count ; i > 0 ; i--){int tempPow = (int) (Math.pow(10000,(i-1)));int arg = number/tempPow;System.out.println(" i = " + i + " arg = " +arg);if(i != count && arg < 1000){//如果處理的數字小于1000,getStringForNumberUnit方法不會添加零sb.append(bigNumbers[0]);}String unitResult = getStringForNumberUnit(arg);sb.append(unitResult);if(i >= 2 && arg != 0){//不是最后一組,且處理時數據不為零if(i%2 == 0){//根據奇偶數,控制萬億交替出現sb.append(bigUnits[3]);}else{sb.append(bigUnits[4]);}}number = number % tempPow;}return sb.toString();}

另,類中兩個數組:

? ? private String[] bigNumbers = {"零","壹","貳","叁","肆","伍","陸","柒","捌","玖"};private String[] bigUnits = {"拾","佰","仟","萬","億"};

主方法中只有一行代碼:
??

?System.out.print(getStringForNumber(1200567800));


測試:
?? ?輸入 1200567800
?? ?輸出 壹拾貳億零伍拾陸萬柒仟捌佰

搞定!!!

都寫完之后,發現確實有點不容易。。。不過細心點還是可以完成的。

本文原地址:https://my.oschina.net/reone/blog/776267

轉載于:https://my.oschina.net/reone/blog/776267

總結

以上是生活随笔為你收集整理的输入十进制数字,中文大写数字的形式读出的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。