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

//========
//使用範例
//========
//壹萬貳仟參佰肆拾伍元整
alert(chineseNumber(12345,'upper'));
//一萬二千三百四十五元整
alert(chineseNumber(12345,'lower'));
//一萬二千三百四十五戰鬥力
alert(chineseNumber(12345,'lower','戰鬥力'));
/*********************************************
* http://liaosankai.pixnet.net/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 '數字必需為整數';
    }
}

不過這個程式仍然有下列的問題:

  1. 輸入10000類的數值,產生的國字數字不是「一萬」,是「壹萬零仟零佰零拾零」
  2. 忘了去判斷小數點的部分
  3. 若考慮尾詞部分,那麼還得考慮小數點部分的接詞,像是幾角幾分之類的

以上若有網友已經有想到解決的方法,歡迎共享修正

低溫烘培 發表在 痞客邦 PIXNET 留言(2) 人氣()


留言列表 (2)

發表留言
  • 布丁
  • 1) 輸入10000類的數值,產生的國字數字不是「一萬」,是「壹萬零仟零佰零拾零」
    用mod試試

  • 感謝你的通知,不過這個bug好像不好弄>"<,我得重試多次才行。不過最近時間不夠,可能要等有空的時候我再來想如何解決了

    低溫烘培 於 2010/08/24 17:12 回覆

  • 吳小頭
  • function chineseNumber(alaberNumber){
    var chineseNumber = ("零壹貳參肆伍陸柒捌玖").split('');
    var amountSmallUnit = ['','拾','佰','仟'];
    var amountBigUnit = ['','萬','億','兆','京','垓','秭','穰','溝','澗','正','載'];
    var alaberNumberSplit = new Array();
    var alaberNumberSplitCount = parseInt(alaberNumber.length/4);
    for(var i=0;i<=alaberNumberSplitCount;i++){
    if(i==0&&alaberNumber.length%4!=0){
    alaberNumberSplit[i] = alaberNumber.substr(0,alaberNumber.length%4);
    alaberNumber = alaberNumber.slice(alaberNumber.length%4);
    }else if(alaberNumber!=''){
    alaberNumberSplit[i] = alaberNumber.substr(0,4);
    alaberNumber = alaberNumber.slice(4);
    }
    }
    var chineseBigNumber = '';
    for(var i=0;i<alaberNumberSplit.length;i++){
    for(var j=0;j<alaberNumberSplit[i].length;j++){
    if(alaberNumberSplit[i][0]!=0&&alaberNumberSplit[i][j]==0&&j==1&&alaberNumberSplit[i].length==4&&alaberNumberSplit[i][2]!=0){
    chineseBigNumber += chineseNumber[alaberNumberSplit[i][j]];
    }else if(alaberNumberSplit[i][j]!=0){
    chineseBigNumber += chineseNumber[alaberNumberSplit[i][j]];
    chineseBigNumber += amountSmallUnit[alaberNumberSplit[i].length-1-j];
    }else if(alaberNumberSplit[i][j]==0&&alaberNumberSplit[i][j-1]!=0){
    if(alaberNumberSplit[i][alaberNumberSplit[i].length-1]!=0){
    chineseBigNumber += chineseNumber[alaberNumberSplit[i][j]];
    }

    }
    }
    if(parseInt(alaberNumberSplit[i])!=0){
    chineseBigNumber+=amountBigUnit[alaberNumberSplit.length-1-i];
    }
    }

    if(chineseBigNumber!=''){
    chineseBigNumber+='元整';
    }
    return chineseBigNumber;
    }
    因工作的需要,正好寫了這個功能,
    看了你的單位 才知道原來 中文大寫的數可以到哪麼大!!
    我寫的可以 輸入 10000 可以顯示 「一萬元整」,
    我測試過了 應該OK!! 你要試試看嗎?
  • 謝謝您,不過目前還沒有遇到相關的需求,不過哪天開始要寫跟金流有關的時候,就必需使用到了=v=,數詞我也是那時候寫的時候,查wiki才知道有那麼多,還滿有趣的

    低溫烘培 於 2010/01/08 10:19 回覆