微软的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 [email protected] * @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 /*----------------------------------------------------------------------------*/ 
|