微软的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
/*----------------------------------------------------------------------------*/