在文章的開頭,推薦一下我最近剛發布的npm小工具:里面包含了將數字轉為漢字的方法, 添加了對金額的支持,並添加了對邊界條件的控制。
https://www.npmjs.com/package/lidashi-tools
安裝方法:npm install lidashi-tools
使用方法:import util from 'lidashi-tools'
util.transformNumber2CN(90071992547444, false, true)
輸出:玖拾萬億零柒佰壹拾玖億玖仟貳佰伍拾肆萬柒仟肆佰肆拾肆元整
//js實現將數字1234轉化為漢字字符串(一千二百三十四)(或大寫漢字壹仟貳佰叄拾肆);
/*阿拉伯數字轉中文數字 中文數字的特點: 每個計數數字都跟着一個權位,權位有:十、百、千、萬、億。 以“萬”為小節,對應一個節權位,萬以下沒有節權位。 每個小節內部以“十百千”為權位獨立計數。 “十百千”不能連續出現,而“萬”和“億”作為節權位時可以和其他權位連用,如:“二十億”。 中文數字對“零”的使用要滿足以下三條規則: 以10000為小節,小節的結尾即使是0,也不使用零。 小節內兩個非0數字之間要使用“零”。 當小節的“千”位是0時(即:1~999),只要不是首小節,都要補“零”。 算法設計的一些說明: 對“零”的第三個規則,把檢測放在循環的最前面並默認為false,可以自然的丟棄最高小節的加零判斷。 單個數字轉換用數組實現,var chnNumChar = ["零","一","二","三","四","五","六","七","八","九"]; 節權位同樣用數組實現,var chnUnitSection = ["","萬","億","萬億","億億"]; 節內權位同樣用數組實現,var chnUnitChar = ["","十","百","千"];*/
注意: 下面的方法只針對1億億以下數字有效,因為在日常項目中,一億億已經是非常大的數字,基本上達不到這個量
//如果數字含有小數部分,那么可以將小數部分單獨取出 //將小數部分的數字轉換為字符串的方法:
var chnNumChar = ["零","一","二","三","四","五","六","七","八","九"]; var chnUnitSection = ["","萬","億","萬億","億億"]; var chnUnitChar = ["","十","百","千"]; var numToChn = function(num){ var index = num.toString().indexOf("."); if(index != -1){ var str = num.toString().slice(index); var a = "點"; for(var i=1;i<str.length;i++){ a += chnNumChar[parseInt(str[i])]; } return a ; }else{ return ''; } } //定義在每個小節的內部進行轉化的方法,其他部分則與小節內部轉化方法相同
function sectionToChinese(section){ var str = '', chnstr = '',zero= false,count=0; //zero為是否進行補零, 第一次進行取余由於為個位數,默認不補零
while(section>0){ var v = section % 10; //對數字取余10,得到的數即為個位數
if(v ==0){ //如果數字為零,則對字符串進行補零
if(zero){ zero = false; //如果遇到連續多次取余都是0,那么只需補一個零即可
chnstr = chnNumChar[v] + chnstr; } }else{ zero = true; //第一次取余之后,如果再次取余為零,則需要補零
str = chnNumChar[v]; str += chnUnitChar[count]; chnstr = str + chnstr; } count++; section = Math.floor(section/10);
} return chnstr; } //定義整個數字全部轉換的方法,需要依次對數字進行10000為單位的取余,然后分成小節,按小節計算,當每個小節的數不足1000時,則需要進行補零
function TransformToChinese(num){ var a = numToChn(num); num = Math.floor(num); var unitPos = 0; var strIns = '', chnStr = ''; var needZero = false; if(num === 0){ return chnNumChar[0]; } while(num > 0){ var section = 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++; } return chnStr+a; } TransformToChinese(12339492835.99302);
//輸出 "一百二十三億三千九百四十九萬二千八百三十五點九九三零二"