如何將漢語數字轉換成阿拉伯數字!

    其實這個題目本身都還有點問題。漢語數字的表達方式何止一兩種,而且還有很多不規範的稱呼。所以,轉換起來也是比較麻煩的。並且由於每個人的叫法不同,因此也不容易判定用戶的輸入是否合符常理和規範。這就只能靠大家去正確對待了。

    我的基本思路是這樣的,比如說:九千八百六十四萬三千二百一十一(98643211),首先,必須提取出該字符串中量級最大的字,在該字符串裏,“萬”是量級最大的,所以,每次都把量級從高到低提取出來。按照:“億”,“萬”,“千”,“百”,“十”的順序,每次將字符串與對其對比。

    因爲是循環,所以,每次取到最大量級後就跳出該次循環,如上例:第一次,取到“萬”字,跳出循環,然後以“萬”字爲分割字符,將字符串分割成兩段(九千八百六十,三千二百一十一)。並且記住該次分割的量級,然後再把前半部分傳遞到另一個遞歸調用函數進行處理(先不講這個函數),然後把後面一部分再次傳遞給該函數進行遞歸調用,而這次取量級將從該次量級以後的開始取。依次重複,直到程序結束。

    那麼,前半部分的字符串將如何處理?首先,我們照樣進行量級查找,由於分割後的字符串要短得多,每次從最高量級找,找到後,分割字符串,並將量級前的數字返回。這裏與上面函數不同的就是需要返回量級前的數字。而前一個函數返回的是整個字符串。一直遞歸到取出所有量級前的數字。每次將其值乘以量級後相加。最後再返回到第一個函數,再與上一次分割字符串的量級相乘。依次完成所有步驟:

所以,依上例,有:

每一次:九千八百六十四萬三千二百一十一 分割成:九千八百六十四三千二百一十一

下一步:將九千八百六十四傳遞給第二個遞歸函數,然後每次分割爲:九千、八百、六十、四。每次分割完成後,都取得量級前的數字。即爲:九、八、六、四

然後每次返回該數字與量級的乘積與上一次遞歸的和,最後遞歸完成時返回整個字符串(九千八百六十四)的值。

第一段字符串處理完成以後,接下來按照同樣的方法(也就是第一個遞歸函數)處理剩下的字符串,依次類推,直到處理完所有字符串。

 

但這只是理論上的東西,實際運用中還有許多小的細節需要注意。比如說:輸入:十九,十、一萬零一等。只要大家多想一些,就能夠處理大部分遇到的問題。當然,這種東西輸入的時候也沒有一個固定的語法可以檢查。如果真要寫個語法,估計也不是那麼容易。測試的時候也只能按照我們常規的習慣去輸入字符串,隨便亂輸入肯定會報錯。並且還要在一定的範圍內使用。

下面,我把自己寫的一點代碼帖上來,沒有處理異常,也沒有寫檢查用戶輸入的語法,但基本上可以實現十萬億以內的數值轉換,只要用戶不刻意地亂輸入:

  1. public class work {
  2.     //全局數組,存儲單位量級
  3.     String [] strCHup ={"億",
  4.             "萬","千","百","十"};
  5.     //通過兩次遞歸調用實現分割.
  6.     public long excuteCharge(String str,int start)
  7.     {
  8.         //存儲量級單位
  9.         long midNumber=0;
  10.         //存儲是否可以找到最高量級
  11.         int bre=-1;
  12.         //找到後根據索引實行字符串分割
  13.         int split = 0;
  14.         //通過循環查找最高量級
  15.         for(int i=start;i<strCHup.length;i++)
  16.         {
  17.             bre =  str.indexOf(strCHup[i]);
  18.             if(bre!=-1)
  19.             {
  20.                 split=i;
  21.                 switch(i)
  22.                 {
  23.                 case 0:
  24.                     midNumber=100000000;
  25.                     break;
  26.                 case 1:
  27.                     midNumber=10000;
  28.                     break;
  29.                 case 2:
  30.                     midNumber=1000;
  31.                     break;
  32.                 case 3:
  33.                     midNumber=100;
  34.                     break;
  35.                 case 4:
  36.                     midNumber=10;
  37.                     break;
  38.                 }
  39.                 //只需要找到最高量級,找到即刻跳出循環.
  40.                 break;
  41.             }
  42.             
  43.         }
  44. //如果沒有找到量級數.說明該數很小,直接調用add()返回該值.
  45.         if(bre==-1)
  46.         {
  47.             return add(str);
  48.         }
  49.         //否則要根據量級進行字符串侵害和返回侵害前部分的值
  50.         else
  51.         {
  52.             //如果大型整數,如:十萬 等.因爲後面不需要再分割
  53.             if(str.length()==bre+1)
  54.             {
  55.                 //對於單個量級的值,如:十、百、千、萬等。不需要裁減字符串。直接返回量級即可
  56.                 if(str.length()==1)
  57.                 {
  58.                     return midNumber;
  59.                 }
  60.                 else
  61.                 {
  62.                     return add(str.substring(0, str.length()-1))*midNumber;
  63.                 }
  64.             }
  65.             //對於只有兩位數的.如:十九.直接調用add()返回值即可.不能在此處遞歸.
  66.             else if(str.length()==bre+2){
  67.                 return add(str);
  68.             }
  69.             //其他情況則取值和分割.然後再遞歸調用.
  70.             else
  71.             {
  72.             String[] strPart = str.split(strCHup[split]);
  73.             return  (add(strPart[0])*midNumber)+excuteCharge(strPart[1],0);
  74.             }
  75.         }
  76.         
  77.     }
  78.     
  79.     
  80.     public long add(String str)
  81.     {
  82.         //存儲strCHup裏具體漢字的數字值
  83.         long mid=0;
  84.         //存儲strNumup裏具體漢字的數字值
  85.         int number=0;
  86.         //存儲傳入字符串的最高級別單位在strCHup數組裏的索引.
  87.         int num=-1;
  88.         for(int i=0;i<strCHup.length;i++)
  89.         {
  90.             //取得量級在字符串中的索引.
  91.             num=str.indexOf(strCHup[i]);
  92.             //定義char型變量,存儲每個漢字.便於後面比較
  93.             char ch=' ';
  94.             ////////////////////////////////////////////////////////////////
  95.             if(num!=-1)
  96.             {
  97.                 
  98.                 switch(i)
  99.                 {
  100.                 case 0:
  101.                     mid=100000000;
  102.                     break;
  103.                 case 1:
  104.                     mid=10000;
  105.                     break;
  106.                 case 2:
  107.                     mid=1000;
  108.                     break;
  109.                 case 3:
  110.                     mid=100;
  111.                     break;
  112.                 case 4:
  113.                     mid=10;
  114.                     break;
  115.                 }
  116.                 
  117.                 //如果以"十"開關的,直接定義number的值.因爲在上面能夠找到它的量級.
  118.                 if((str.toCharArray())[0]=='十')
  119.                 {
  120.                     number=1;
  121.                 }
  122.                 //否則,取得量級前的數字進行比較,再確定number的值
  123.                 else
  124.                 {
  125.                     ch = (str.toCharArray())[num-1];
  126.                 }
  127.                 
  128.                 
  129.                 
  130.                 //////////////////////////////////////////////////////
  131.             }
  132.             //循環結束
  133.             //////////////////////////////////////////////////////////////////
  134.             //如果整個字符串就一個字,那麼就應該取該值進行比較.而不是再取量級前的數字.
  135.             if(str.length()==1){
  136.                 
  137.                 ch = (str.toCharArray())[0];
  138.             }
  139.             //防止幾萬零幾這樣的數.
  140.             else if((str.length()==2)&&((str.toCharArray())[0]=='零'))
  141.             {
  142.                 ch = (str.toCharArray())[1];
  143.             }
  144.             switch(ch)
  145.             {
  146.             case '零':
  147.                 number=0;
  148.                 break;
  149.             case '一':
  150.                 number=1;
  151.                 break;
  152.             case '二':
  153.                 number=2;
  154.                 break;
  155.             case '三':
  156.                 number=3;
  157.                 break;
  158.             case '四':
  159.                 number=4;
  160.                 break;
  161.             case '五':
  162.                 number=5;
  163.                 break;
  164.             case '六':
  165.                 number=6;
  166.                 break;
  167.             case '七':
  168.                 number=7;
  169.                 break;
  170.             case '八':
  171.                 number=8;
  172.                 break;
  173.             case '九':
  174.                 number=9;
  175.                 break;
  176.             }
  177.             /////////////////////////////////////////////////////////////////
  178.             
  179.             if(num!=-1)
  180.             {
  181.                 break;
  182.             }
  183.                 
  184.         }
  185.             if(num==-1)
  186.             {
  187.                 return number;
  188.             }
  189.             
  190.             String strLeft = str.substring(num+1);
  191.             return (number*mid)+add(strLeft);
  192.     }
  193. }

 

資源下載地址:http://download.csdn.net/source/796217

發佈了11 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章