2008年7月24日 星期四

Javascript處理數字國字

var stmp = "";
function nst(t)
{
if(t.value==stmp) return;//如果等於上次輸入則返回
var ms = t.value.replace(/[^\d\.]/g,"").replace(/(\.\d{2}).+$/,"$1").replace(/^0+([1-9])/,"$1").replace(/^0+$/,"0");
//replace(/[^\d\.]/g,"")去掉輸入當中不是數字和.的字元
//replace(/(\.\d{2}).+$/,"$1")
//匹配從字元開始的第一個.後面的所有字元,由於沒有使用g標記,
//所以只匹配開始第一次 然後用小數點和後兩位進行替換以確定數值最後的格式正確 高.
//replace(/^0+([1-9])/,"$1") 匹配以多個0開頭的數值替換為去掉0後的數值做為數字的第一位 也是匹配開始的一次.
//replace(/^0+$/,"0") 匹配以0開始和結束的多個0為一個0 也就是0000000 輸入->轉換成一個0
//以下確定輸入的為過濾後的合法數位
//alert(ms);
var txt = ms.split(".");
//alert(txt[0]);
//如果ms值不小數點存在則txt[0]=小數點前的值否則等於ms
//regexp:/\d{4}(,|$)/ 匹配四位元數位和,的集合或者四位元數位和字元結尾的集合
while(/\d{4}(,|$)/.test(txt[0]))//如果為txt[0]=4123
txt[0] = txt[0].replace(/(\d)(\d{3}(,|$))/,"$1,$2");
//txt[0].replace(/(\d)(\d{3}(,|$))/,"$1,$2")是將txt[0]進行替換後再賦給它
//regexp:/(\d)(\d{3}(,|$))/ 將四個數字份為兩組第一個數字為第一位,後三位和其他結尾為每二位
//並替換成 第一位,第二位 注意 ,的使用很好. 也就是將4123先替換成4,123
//由於此運算式默認採用貪婪匹配所以從數值後向前匹配再通過迴圈進行再匹配替換從而可以將
//12345678分成你想要的123,456,78 樓主彩用(,|$)很精典,因為它略去了第二次匹配時的,問題
t.value = stmp = txt[0]+(txt.length>1?"."+txt[1]:"");
//最終賦值到輸入框中
//如果有小數點則加上並購成最終數位否則顯示替換後的txt[0]
bbb.value = number2num1(ms-0);
//將ms轉換為數位送到number2num1去轉換
}

function number2num1(strg)
{
var number = Math.round(strg*100)/100;
//先進行小數位數轉換也就是四捨五入由於上面已限定了小數位可不用
number = number.toString(10).split('.');//轉換成十進位字元並用小數點隔開
var a = number[0];//取小數點前的值如果有小數點則取它前面的否則取這個數值
if (a.length > 12)//判斷是否超過了計算範圍
return "數值超出範圍!支持的最大數值為 999999999999.99";//退出
var e = "零壹貳參肆伍陸柒捌玖";
var num1 = "";
var len = a.length-1;
for (var i=0 ; i<=len; i++)//按單個數位逐個進行遍歷
num1 += e.charAt(parseInt(a.charAt(i))) + [["圓","萬","億"][Math.floor((len-i)/4)],"拾","佰","仟"][(len-i)%4];
//e.charAt(parseInt(a.charAt(i)))將所選數字對應到相應的大寫陣列下標並取出大寫值
//[["圓","萬","億"][Math.floor((len-i)/4)],"拾","佰","仟"][(len-i)%4]
// ["圓","萬","億"][Math.floor((len-i)/4)]如果小於4位元顯示 "圓"
// 如果大於4位元小於8位元則顯示 "萬"
// 如果大於8位元則顯示 "億"
//由上面得到一個新陣列 -> 如果小於4位元顯示 ["圓","拾","佰","仟"]
// 如果大於4位元小於8位元則顯示 ["萬","拾","佰","仟"]
// 如果大於8位元則顯示 ["億","拾","佰","仟"]
// [(len-i)%4] 得到相應的所屬下標 分別得到 "圓","萬","億","拾","佰","仟
//下面處理小數點後的數值
if(number.length==2 && number[1]!="")
{
var a = number[1];//得到.後數值
for (var i=0 ; i num1 += e.charAt(parseInt(a.charAt(i))) + ["角","分"];
}
//以上完成後再進行正則過濾掉一些重複字元
num1 = num1.replace(/零佰|零拾|零仟|零角/g,"零");//全域替換零
num1 = num1.replace(/零{2,}/g,"零");//替換2個以上零為一個零
num1 = num1.replace(/零(?=圓|萬|億)/g,"");//替換零圓,零萬,零億,中的零為空
num1 = num1.replace(/億萬/,"億");//替換億萬為億隻替換第一次
num1 = num1.replace(/^圓零?/,"");//替換字串中開始的圓零為空此匹配為非貪婪匹配.適用於.57轉換時
//如果要最終數值不為空並且該串結尾不為"分"結尾則加一個"整字"
if(num1!="" && !/分$/.test(num1))
num1 += "整";
return num1;
}


數字金額:

國字金額:

沒有留言: