一般數字轉為中文數字(國字數字)

我承認我真的太閒了= =,無聊的我寫了一個將「12345」轉為中文數字「壹萬貳仟參佰肆拾伍元整」的小函式,可是感覺會用到的機率不大,如果哪位有需要就拿去用吧


//========
//使用範例
//========
//壹萬貳仟參佰肆拾伍元整
alert(chineseNumber(12345,'upper'));
//一萬二千三百四十五元整
alert(chineseNumber(12345,'lower'));
//一萬二千三百四十五戰鬥力
alert(chineseNumber(12345,'lower','戰鬥力'));


/*********************************************
* http://doublekai.org/blog/
* copyright 2008 sankai
* licensed under the MIT and GPL licenses.
***********************************************/
function chineseNumber(number,lowerorsupper,tail){
    //轉換值是否為整數
    if(!isNaN(parseInt(number * 1))){
		//--------------
        // 定義變數
		//--------------
		//小寫的中文數字
        var chineseNumber_lower = ('〇一二三四五六七八九').split('');
		//大寫的中文數字
        var chineseNumber_upper = ('零壹貳參肆伍陸柒捌玖').split('');
		//數詞單位陣列
		var chineseOrder = ('十百千元萬億兆京垓秭穰溝澗正載').split('');
        if(tail == null){
            chineseOrder[3] = '元整';
        } else{
            chineseOrder[3] = tail;
        }
		//定義儲存轉換後的數字結果陣列
		var transformNumber = new Array();
        //逆轉數字後的數字陣列
		var numberAsString = new Array();
		//用來記錄移動位數的索引(從tail開始)
		var orderFlag = 3;
		//--------------
        // 數字處理
		//--------------
		//將數字字串化
		number = number+'';
		//逆轉數字後儲入陣列
		for (var i=number.length-1; i>=0; i-- ){
       		numberAsString[numberAsString.length++] = number.charAt(i);
		}
		//針對每個英文數字處理
        for(var i=0; i<numberAsString.length; i++){
	        //產生對應的中文數字,並且依大小寫有所不同
            if(lowerorsupper == 'upper'){
                numberAsString[i] = chineseNumber_upper[numberAsString[i]];
				chineseOrder[0] = '拾';
				chineseOrder[1] = '佰';
				chineseOrder[2] = '仟';
            } else {
                numberAsString[i] = chineseNumber_lower[numberAsString[i]];
				chineseOrder[0] = '十';
				chineseOrder[1] = '百';
				chineseOrder[2] = '千';
            }
			//添加數詞
			switch((i+1)%4){
				case 1:
					transformNumber[numberAsString.length-i] = numberAsString[i]+chineseOrder[orderFlag];
				break;
				case 2:
					transformNumber[numberAsString.length-i] = numberAsString[i]+chineseOrder[0];
				break;
				case 3:
					transformNumber[numberAsString.length-i] = numberAsString[i]+chineseOrder[1];
				break
				case 0:
					transformNumber[numberAsString.length-i] = numberAsString[i]+chineseOrder[2];
				break;
			}
			//每處理四個數字後移動位數索引
			if((i+1)%4 == 0){
				orderFlag++;
			}
        }
		//回傳轉換後的中文數字
		return transformNumber.join('');
    } else {
        return '數字必需為整數';
    }
}

3 Responses to “一般數字轉為中文數字(國字數字)”

  1. sankai - 八月 29, 2008

    呃...無意間發現我這個程式有BUG,先自己留言當作提醒,以後有時間再來改
    1) 輸入10000類的數值,產生的國字數字不是「一萬」,是「壹萬零仟零佰零拾零」
    2) 忘了去判斷小數點的部分
    3) 若考慮尾詞部分,那麼還得考慮小數點部分的接詞,像是幾角幾分之類的
    以上若有網友已經有想到解決的方法,歡迎共享修正

  2. k - 九月 22, 2012

    歡迎您試試
    CeJS 中文數字

    https://github.com/kanasimi/CeJS/wiki/%E4%B8%AD%E6
    %96%87%E6%95%B8%E5%AD%97

  3. will - 十月 22, 2013

    你好,我正好用到了。
    輸入10000類的數值,產生的國字數字不是「一萬」,是「壹萬零仟零佰零拾零」
    這和業务有關,財务上正好合适。
    当然后面还有,元、角、分需要处理。

回應(Leave a Reply)