JavaScript實現阿拉伯數字和中文數字互相轉換

JavaScript實現阿拉伯數字和中文數字互相轉換


作者:zhoutk 字體:[增加 減小] 類型:轉載 時間:2016-06-12 我要評論

JavaScript實現阿拉伯數字和中文數字互相轉換可以用數組的循環檢測後的替換來實現,下面主要講解其中的一些核心算法:

阿拉伯數字轉中文數字
中文數字的特點:

  • 每個計數數字都跟着一個權位,權位有:十、百、千、萬、億。
  • 以“萬”爲小節,對應一個節權位,萬以下沒有節權位。
  • 每個小節內部以“十百千”爲權位獨立計數。
  • “十百千”不能連續出現,而“萬”和“億”作爲節權位時可以和其他權位連用,如:“二十億”。

中文數字對“零”的使用要滿足以下三條規則:

  • 以10000爲小節,小節的結尾即使是0,也不使用零。
  • 小節內兩個非0數字之間要使用“零”。
  • 當小節的“千”位是0時(即:1~999),只要不是首小節,都要補“零”。

算法設計的一些說明:

  • 對“零”的第三個規則,把檢測放在循環的最前面並默認爲false,可以自然的丟棄最高小節的加零判斷。
  • 單個數字轉換用數組實現,var chnNumChar = ["零","一","二","三","四","五","六","七","八","九"];
  • 節權位同樣用數組實現,var chnUnitSection = ["","萬","億","萬億","億億"];
  • 節內權位同樣用數組實現,var chnUnitChar = ["","十","百","千"];

節內轉換算法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function SectionToChinese(section){
  varstrIns = '', chnStr ='';
  varunitPos = 0;
  varzero = true;
  while(section > 0){
    varv = section % 10;
    if(v === 0){
      if(!zero){
        zero =true;
        chnStr = chnNumChar[v] + chnStr;
      }
    }else{
      zero =false;
      strIns = chnNumChar[v];
      strIns += chnUnitChar[unitPos];
      chnStr = strIns + chnStr;
    }
    unitPos++;
    section = Math.floor(section / 10);
  }
  returnchnStr;
}

轉換算法主函數:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function NumberToChinese(num){
  varunitPos = 0;
  varstrIns = '', chnStr ='';
  varneedZero = false;
 
  if(num === 0){
    returnchnNumChar[0];
  }
 
  while(num > 0){
    varsection = num % 10000;
    if(needZero){
      chnStr = chnNumChar[0] + chnStr;
    }
    strIns = SectionToChinese(section);
    strIns += (section !== 0) ? chnUnitSection[unitPos] : chnUnitSection[0];
    chnStr = strIns + chnStr;
    needZero = (section < 1000) && (section > 0);
    num = Math.floor(num / 10000);
    unitPos++;
  }
 
  returnchnStr;
}

中文數字轉阿拉伯數字
設計思想:

  • 將中文數學轉換成阿拉伯數字。
  • 將中文權位轉換成10的位數。
  • 對每個權位依次轉換成位數並求和。
  • 零直接忽略即可。

中文數字轉換成阿拉伯數字用如下對象實現:

1
2
3
4
5
6
7
8
9
10
11
12
var chnNumChar = {
  零:0,
  一:1,
  二:2,
  三:3,
  四:4,
  五:5,
  六:6,
  七:7,
  八:8,
  九:9
};

中文權位轉換成10的位數及節權標誌用如下對象實現:

1
2
3
4
5
6
7
var chnNameValue = {
  十:{value:10, secUnit:false},
  百:{value:100, secUnit:false},
  千:{value:1000, secUnit:false},
  萬:{value:10000, secUnit:true},
  億:{value:100000000, secUnit:true}
}

轉換算法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function ChineseToNumber(chnStr){
  varrtn = 0;
  varsection = 0;
  varnumber = 0;
  varsecUnit = false;
  varstr = chnStr.split('');
 
  for(vari = 0; i < str.length; i++){
    varnum = chnNumChar[str[i]];
    if(typeofnum !== 'undefined'){
      number = num;
      if(i === str.length - 1){
        section += number;
      }
    }else{
      varunit = chnNameValue[str[i]].value;
      secUnit = chnNameValue[str[i]].secUnit;
      if(secUnit){
        section = (section + number) * unit;
        rtn += section;
        section = 0;
      }else{
        section += (number * unit);
      }
      number = 0;
    }
  }
  returnrtn + section;
}
發佈了17 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章