数字转中文大写
代码1:(实现到小数点后百分位)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>数字中文大小写转换</title>
</head>
<body>
请输入金额:<input type="text" id="content">
<div style="margin-top:20px;">
转换的结果是:<span id="resl" style="color:red; margin-left:20px;"></span>
</div>
<script>
var oContent = document.getElementById("content");
var oChange = document.getElementById("change");
var oResl = document.getElementById("resl");
oResl.innerHTML="输出结果";
oContent.onkeyup = function() {
var n = oContent.value;
if (/^0|[A-Za-z]+$/.test(n))
{
alert("数据非法,请输入数字!");
}
else{
var unit = "千百拾亿千百拾万千百拾元角分", str = "";
n += "00";
var p = n.indexOf('.');
if (p >= 0){
n = n.substring(0, p) + n.substr(p+1, 2);
}
unit = unit.substr(unit.length - n.length);
for (var i=0; i < n.length; i++){
str += '零壹贰叁肆伍陆柒捌玖'.charAt(n.charAt(i)) + unit.charAt(i);
}
}
oResl.innerHTML = str.replace(/零(千|百|拾|角)/g, "零").replace(/(零)+/g, "零").replace(/零(万|亿|元)/g, "$1").replace(/零分$/g, "").replace(/元$/g, "元整");
} //代码结束
</script>
</body>
</html>
代码2:(实现到小数点后万分位)带注释-详细分析过程
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>数字中文大小写转换</title>
</head>
<body>
<input type="text" id="content">
<div style="margin-top:20px;">
转换的结果是:<span id="resl" style="color:red; margin-left:20px;"></span>
</div>
<script>
var oContent = document.getElementById("content");
var oChange = document.getElementById("change");
var oResl = document.getElementById("resl");
oResl.innerHTML="未知";
//alert(oChange);
oContent.onkeyup = function() {
//alert("111")
var n = oContent.value;
//alert(n)
// (!/^(0|[1-9]\d*)(\.\d+)?$/.test(n))
if (/^0|[A-Za-z]+$/.test(n))//正则表达式表示法 以双斜杆包围的正则表达式对象,如: /abc/
// ^:匹配一个输入或一行的开头,/^a/匹配"an",而不匹配"An"
// $:匹配一个输入或一行的结尾,/a$/匹配"na",而不匹配"nA"
// \:转义字符
// \d 匹配一个字数字符,/\d/ = /[0-9]/
//[xyz] 字符集(character set),匹配这个集合中的任一一个字符(或元字符)
//x|y 匹配x或y
// *:匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa
// ?:匹配前面元字符0次或1次,/ba*/将匹配b,ba
// +:匹配前面元字符1次或多次,/ba*/将匹配ba,baa,baaa
// text() 检测方法
{
alert("数据非法,请输入数字!");
//return "数据非法";
}
else{
//alert("合法")
var unit = "千百拾亿千百拾万千百拾元角分厘毫", str = "";
n += "0000";
//indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置 0,1...,如果没有就返回-1。
var p = n.indexOf('.');
if (p >= 0){
//substring() 方法用于提取字符串中介于两个指定下标之间的字符 stringObject.substring(start,stop)
//substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。stringObject.substr(start,length)
n = n.substring(0, p) + n.substr(p+1, 4); //将输入数字中的“.”去掉,如125.02,变成12502
//alert(n);
}
//alert("n的值为:"+n);
unit = unit.substr(unit.length - n.length);
//alert("unit截取到的值为:"+unit);
for (var i=0; i < n.length; i++)
//charAt() 方法可返回指定位置,的字符. 注意:参数是位置,是下标,返回是“字符”。
str += '零壹贰叁肆伍陆柒捌玖'.charAt(n.charAt(i)) + unit.charAt(i); //逐个拼合数字转化的结果
}
//alert("初步得到的结果为:"+str);
//replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
//语法: stringObject.replace(regexp/substr,replacement) 一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的。
// 双斜杆之间为正则表达式 /零(千|百|拾|角)/
//i 执行大小写不敏感的匹配
//g 执行一个全局的匹配,简而言之,就是找到所有的匹配,而不是在找到第一个之后就停止了
// 输入1: 得到的初始结果str为: 壹元零角零分
//壹元零零分 壹元零分
// $1:表示正则表达式中:/零(万|亿|元)/g 的第一个括号部分(万|亿|元),因此产生的效果是,将正则表达式:/零(万|亿|元)/g 所有的匹配内容,用$1:(万|亿|元) 的内容去替换。
// 假如第一个是:零亿 将用 亿 去替换。 从而实现删除零的作用。 妙哉妙哉
oResl.innerHTML = str.replace(/零(千|百|拾|角|分|厘)/g, "零").replace(/(零)+/g, "零").replace(/零(万|亿|元)/g, "$1").replace(/零毫$/g, "").replace(/元$/g, "元整");
//return str.replace(/零(千|百|拾|角)/g, "零").replace(/(零)+/g, "零").replace(/零(万|亿|元)/g, "$1").replace(/(亿)万|壹(拾)/g, "$1$2").replace(/^元零?|零分/g, "").replace(/元$/g, "元整");
}
</script>
</body>
</html>
过程分析图
本文源于个人见解,如有不足,欢迎指正。
参考链接:http://www.cnblogs.com/zsanhong/p/3509464.html
正则表达式大全链接:http://www.jb51.net/article/43190.htm (讲解非常详细完整)