转换阿拉伯数字为汉字数码

来源:互联网 发布:淘宝美工每天工作内容 编辑:程序博客网 时间:2024/06/05 00:23
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

    微软的Office Word 2000 中有一个 "插入->数字" 的功能, 可自由选择数字类型. 注意到有一种类型为 "一二三..." (或:"壹贰叁..."), 此功能在会计应用中应该较广. 本人琢磨几日, 经过多次修改, 编写了一个 JavaScript 版本的 "转换阿拉伯数字为汉字数码" 函数.
    本人第一次在 CSDN 上发表文章, 各位对此文章有何看法, 敬请提出, 不胜感激!
    以下是函数代码 (某些变量的叫法可能不大准确). 顺便说明, 主体函数是 changeDigitToHanzi(inString,isUpcase,times,errorCode), 其中参数 "inString" 要求 "只能含有数码字符, 并且不能以0开头", 此项处理既可置于主体函数内, 亦可置于主体函数外, 文中采用前者, 并提供另一函数 formatedDigit(inString) 实现之.
    调用举例:
    <script language="javascript">
        document.writeln
            (changeDigitToHanzi("13800138000",false,"个万亿兆","E"));
        document.writeln
            (changeDigitToHanzi("1380013800013800138",false,"个万亿兆","E"));
    </script>
    显示为:
        一百三十八亿〇一十三万八千
        E

/*----------------------------------------------------------------------------*/
/**
 * 转换阿拉伯数字为汉字数码
 * @author fpeez
 * @author fpeez@163.com
 * @version 1.0
*/


/**
 * 主体函数, 实现转换
 * @param inString    (String)输入的阿拉伯数字字符串(如: "13800138000")
 * @param isUpcase    (boolean)输出汉字数码大小写指示(如: false)
 * @param times       (String)阶数(如: "个万亿兆...")
 * @param errorCode   (String)错误时(溢出,空值,...)归零显示(如: "E")
 * @return ~errorCode
 * @return ~OUT       (String)转换后的汉字数码(如: "一百三十八亿〇一十三万八千")
*/
function changeDigitToHanzi(inString, isUpcase, times, errorCode)
{

    /** 输入字符串预处理, 亦可放到函数外执行 **/
    inString=formatedDigit(inString);

    /** 变量定义 **/
    var base,digit;                           // times: 阶数("个万亿兆...")
    if(isUpcase)
    {
        base="个拾佰仟";                      // base: 位数
        digit="零壹贰叁肆伍陆柒捌玖";         // digit: 汉字数码串(大写)
    }
    else
    {
        base="个十百千";
        digit="〇一二三四五六七八九";
    }

    var sLen,b,t,bLen;
    sLen=inString.length;                     // 输入字符串的长度
    bLen=base.length;                         // 位数的长度
    if(sLen>bLen*times.length || sLen<1)      // 溢出归零
        return errorCode;
    b=(sLen-1)%bLen;                          // 当前数码在base中的位置
    t=Math.floor((sLen-1)/bLen);              // 当前数码在times中的位置

    var i,at,zero;
    i=0;                                      // at某个位上的数码, i循环计数
    zero="";                                  // 保存数字中的0值

    var OUT;
    OUT="";                                   // 输出汉字数码

    /** 开始 **/
    at=inString.charCodeAt(i)-48;             // 处理"一十二"为"十二", 此时i=0
    if(at==1 && b==1)
    {
        OUT+=base.charAt(b--);
        i+=1;                                 // 此时, i=1
    }

    while(i<sLen)
    {
        at=inString.charCodeAt(i++)-48;
        if(b!=0)
        {
            if(at!=0)
            {
                OUT+=zero;
                zero="";
                OUT+=digit.charAt(at);
                OUT+=base.charAt(b);
            }
            else
                zero=digit.charAt(0);         // 此时, zero="零"或"〇"
            b--;
        }
        else
        {
            if(at!=0)
            {
                OUT+=zero;
                OUT+=digit.charAt(at);
            }
            zero="";
            if(t!=0) OUT+=times.charAt(t--);
            b=bLen-1;
        }
    }

    return OUT;  

}//END


/**
 * 处理输入字符串, 只保留数码字符(挑出其中的数码字符), 并除去开头的0
 * @param inString    (String)输入的字符串(如: " Z00138G00D138X000 S ")
 * @return ~OUT       (String)处理后字符串(如: "13800138000")
*/
function formatedDigit(inString)
{
    var i,at,OUT,atMin;
    OUT="";
    atMin=1;

    for(i=0;i<inString.length;i++)
    {
        at=inString.charCodeAt(i)-48;
        if(at>=atMin && at<=9)
        {
            OUT+=at;
            atMin=0;
        }
    }

    return OUT;

}//END
/*----------------------------------------------------------------------------*/

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>