数字转中文大写

数字转中文大写

  代码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  (讲解非常详细完整)

原文地址:https://www.cnblogs.com/banana618859/p/6307780.html