關於金額轉換的問題(轉)

http://www.cssrain.cn/article.asp?id=40

<script language="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<a.length; 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;
}

</script>
<!--按鍵彈起時觸發轉換事件-->
小寫金額:<input type="text" name="aaa" onkeyup="nst(this)"><br>
大寫金額:<input type="text" name="bbb" size=80>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章