<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;
}
/*
以上是我对海浪的源码的理解不当之处还请指正.
-----------shiwei2006 2007 04-11 11:00--------------
*/
</script>
<!--按键弹起时触发转换事件-->
小写金额:<input type="text" name="aaa" onkeyup="nst(this)"><br>
大写金额:<input type="text" name="bbb" size=80>