谁能提供将小写金额转换为大写金额的函数?或者转换下面的pascal函数到javascript?

光行天下1024 2001-12-20 11:17:51
Function TKAIMoney.TurnMoneyStr:String; //*** 将数值转换成Money字符串 ***
var ChineseNumber:array [1..9,0..3] of string[4];
JiaoNumber,FenNumber:array [1..9] of string[4];
i,WhereP,T,PT:integer;
TempString,StrZheng:string;
SString,DString:String;
begin
SString:=FloatToStr(fMoneyNumber);

ChineseNumber[1,0]:='壹';
ChineseNumber[1,1]:='壹拾';
ChineseNumber[1,2]:='壹佰';
ChineseNumber[1,3]:='壹仟';

ChineseNumber[2,0]:='贰';
ChineseNumber[2,1]:='贰拾';
ChineseNumber[2,2]:='贰佰';
ChineseNumber[2,3]:='贰仟';

ChineseNumber[3,0]:='叁';
ChineseNumber[3,1]:='叁拾';
ChineseNumber[3,2]:='叁佰';
ChineseNumber[3,3]:='叁仟';

ChineseNumber[4,0]:='肆';
ChineseNumber[4,1]:='肆拾';
ChineseNumber[4,2]:='肆佰';
ChineseNumber[4,3]:='肆仟';

ChineseNumber[5,0]:='伍';
ChineseNumber[5,1]:='伍拾';
ChineseNumber[5,2]:='伍佰';
ChineseNumber[5,3]:='伍仟';

ChineseNumber[6,0]:='陆';
ChineseNumber[6,1]:='陆拾';
ChineseNumber[6,2]:='陆佰';
ChineseNumber[6,3]:='陆仟';

ChineseNumber[7,0]:='柒';
ChineseNumber[7,1]:='柒拾';
ChineseNumber[7,2]:='柒佰';
ChineseNumber[7,3]:='柒仟';

ChineseNumber[8,0]:='捌';
ChineseNumber[8,1]:='捌拾';
ChineseNumber[8,2]:='捌佰';
ChineseNumber[8,3]:='捌仟';

ChineseNumber[9,0]:='玖';
ChineseNumber[9,1]:='玖拾';
ChineseNumber[9,2]:='玖佰';
ChineseNumber[9,3]:='玖仟';

JiaoNumber[1]:='壹角';
JiaoNumber[2]:='贰角';
JiaoNumber[3]:='叁角';
JiaoNumber[4]:='肆角';
JiaoNumber[5]:='伍角';
JiaoNumber[6]:='陆角';
JiaoNumber[7]:='柒角';
JiaoNumber[8]:='捌角';
JiaoNumber[9]:='玖角';

FenNumber[1]:='壹分';
FenNumber[2]:='贰分';
FenNumber[3]:='叁分';
FenNumber[4]:='肆分';
FenNumber[5]:='伍分';
FenNumber[6]:='陆分';
FenNumber[7]:='柒分';
FenNumber[8]:='捌分';
FenNumber[9]:='玖分';

WhereP:=0;
StrZheng:='圆';
for i:=1 to Length(SString) do
if SString[i]='.' then WhereP:=i;
if WhereP=0 then
begin
WhereP:=Length(SString)+1;
StrZheng:='圆整';
end;
PT:=0;{表示前一个字符的值}
TempString:='';
if not((WhereP=1)or(WhereP=2))then
begin
for i:=1 to WhereP-1 do
begin
if SString[WhereP-i]='-'
then TempString:='负'+TempString
else begin
if SString[WhereP-i]='0' then
begin
if (i=5)or(i=9) then
begin
if i=5 then TempString:='万'+TempString;
if i=9 then TempString:='亿'+TempString;
end
else begin
if PT<>0 then TempString:='零'+TempString;
end;
end
else begin
if (i=5)or(i=9) then
begin
T:=(i mod 4)-1;
if T=-1 then T:=3;
if i=5 then TempString:=ChineseNumber[StrToInt(SString[WhereP-i]),T]+'万'+TempString;
if i=9 then TempString:=ChineseNumber[StrToInt(SString[WhereP-i]),T]+'亿'+TempString;
end
else begin
T:=(i mod 4)-1;
if T=-1 then T:=3;
TempString:=ChineseNumber[StrToInt(SString[WhereP-i]),T]+TempString;
end;
end;
end;
if SString[WhereP-i]<>'-' then PT:=StrToInt(SString[WhereP-i]);
end;
end;
{ else begin
if Length(SString)>WhereP then
begin
if WhereP=1 then TempString:='零'+TempString;
if WhereP=2 then
begin
if SString[1]='-' then TempString:='负零'+TempString
else TempString:=ChineseNumber[StrToInt(SString[1]),0]+TempString;
end;
end;
end;}
if WhereP=2 then
begin
TempString:=ChineseNumber[StrToInt(SString),0];
if SString='0' then TempString:='零';
end;//<- end if
//______________________
if SString<>'' then TempString:=TempString+StrZheng;//'圆';
if (WhereP<>0) then
begin
if (Length(SString)-WhereP)>0 then
begin
if SString[WhereP+1]<>'0' then
TempString:=TempString+JiaoNumber[StrToInt(SString[WhereP+1])];
if (Length(SString)-WhereP)>1 then
begin
if SString[WhereP+2]<>'0' then
TempString:=TempString+FenNumber[StrToInt(SString[WhereP+2])];
end;
end;
//____________

end;
if SString<>'' then DString:=TempString
else DString:='';

TurnMoneyStr:=DString;
end;
...全文
152 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
光行天下1024 2001-12-25
  • 打赏
  • 举报
回复
请 bestext(bestext) 到 http://www.csdn.net/expert/topic/206/206435.shtm 领20分
到 http://www.csdn.net/expert/topic/210/210470.shtm 领46分
再加上本帖的40,够意思吧。
bestext 2001-12-22
  • 打赏
  • 举报
回复
其实可以转化无限大的数字,但是我不知数量词了

<script language=JavaScript>


//下面代码将一个小于10的17次方的金额转换为银行形式
//bestext(原创于2001-12-22 语言JavaScript)


//下面代码将一个小于等于四位数的整数金额转换为银行形式
function SmallToRMB(n1)
{
sNum = "零壹贰叁肆伍陆柒捌玖";
sBit1 = new Array('仟','佰','拾','');
n1 = "0000"+n1;
n1 = n1.substring(n1.length-4,n1.length);
smallstr = "";
for (i=0;i<4;i++)
smallstr += sNum.charAt(n1.charAt(i)) + sBit1[i];
smallstr = smallstr.replace('零仟','零');
smallstr = smallstr.replace('零佰','零');
smallstr = smallstr.replace('零拾','零');
smallstr = smallstr.replace('零零零','零');
smallstr = smallstr.replace('零零','零');
return smallstr;
}

//下面代码将一个大于四位数的整数金额转换为银行形式
function BigToRMB(n2)
{
sBit2 = new Array('元','万','亿','万');
n2 = n2 + "";
len = n2.length;
if (len <5) return (SmallToRMB(n2)+"元").replace('零元','元');
bigstr = "";
j = 0;
while (len > 4)
{
bigstr = SmallToRMB(n2.substring(len-4,len)) + sBit2[j] + bigstr;
len -= 4;
j ++;
}
bigstr = SmallToRMB(n2.substring(0,len)) + sBit2[j] + bigstr;
bigstr = bigstr.replace('零亿','亿');
bigstr = bigstr.replace('零万','万');
bigstr = bigstr.replace('零元','元');
bigstr = bigstr.replace('亿万','亿');
return bigstr;
}

//下面代码将一个两位的小数金额转换为银行形式
function DecToRMB(n3)
{
sNum = "零壹贰叁肆伍陆柒捌玖";
decstr = sNum.charAt(n3.charAt(0)) + "角" + sNum.charAt(n3.charAt(1)) + "分";
decstr = decstr.replace('零角零分','整');
decstr = decstr.replace('零角','零');
decstr = decstr.replace('零分','');
return decstr;
}

//下面代码将一个绝对值小于10的17次方的金额转换为银行形式
function NumToRMB(n4)
{
if (isNaN(n4)) return "非数字,无法转换!";
sign = (n4 < 0) ? "负" : "";
n4 = (n4 < 0) ? n4.substring(1,n4.length) : n4+"";
point = n4.indexOf('.');
if (point < 0) {
intStr = n4;
decStr = "00";
} else {
intStr = n4.substring(0,point);
decStr = n4.substring(point+1,n4.length);
decStr = (decStr+"00").substring(0,2);
}
if (intStr.length > 16) return "超出计算范围!";
str = BigToRMB(intStr) + DecToRMB(decStr);
if (str.charAt(0) == '零') str = str.substring(1,str.length);
return sign + str;
}

</script>

<input type=text value="" id="num1" size=40><br>
<input type=text value="" id="num2" size=40><br>
<input type=button value="转换" onclick="num2.value=NumToRMB(num1.value)">
julyclyde 2001-12-22
  • 打赏
  • 举报
回复
应该用递归吧?
bestext 2001-12-22
  • 打赏
  • 举报
回复
“天统乎体,故八变而终于十六。地分乎用,故六变而终于十二。天起于一,而终于七秭九千五百八十六万六千一百一十垓九千九百四十六万四千八京八千四百三十九万一千九百三十六兆。地起于十二,而终于二百四垓六千九百八十万七千三百八十一京五千四百九十一万八千四百九十九兆七百二十万亿也。”
(宋 劭雍 皇极经世书 观物外篇下 以元经会大小运数第七)

依此,数量单位看来是:一十百千万亿(10^8)兆(10^16)京(10^24)垓(10^32)秭(10^40)
以此为据,将函数BigToRMB略作改动即可转换小于10^49的数字到银行形式:

//hehe,天文数字……
function BigToRMB(n2)
{
sBit2 = new Array('元','万','亿','万','兆','万','京','万','垓','万','秭','万');
n2 = n2 + "";
len = n2.length;
if (len <5) return (SmallToRMB(n2)+"元").replace('零元','元');
bigstr = "";
j = 0;
while (len > 4)
{
bigstr = SmallToRMB(n2.substring(len-4,len)) + sBit2[j] + bigstr;
len -= 4;
j ++;
}
bigstr = SmallToRMB(n2.substring(0,len)) + sBit2[j] + bigstr;

bigstr = bigstr.replace('零亿','亿');
bigstr = bigstr.replace('零万','万');
bigstr = bigstr.replace('零元','元');
bigstr = bigstr.replace('秭万','秭');
bigstr = bigstr.replace('垓万','垓');
bigstr = bigstr.replace('京万','京');
bigstr = bigstr.replace('兆万','兆');
bigstr = bigstr.replace('亿万','亿');

return bigstr;
}

另外,要将函数NumToRMB中 if(intStr.length>16) 改为 if(intStr.length>48)

……难道世上会有这么大一笔钱吗???
光行天下1024 2001-12-21
  • 打赏
  • 举报
回复
先给westfly(西翔)预定50分,请大家继续讨论,继续加分。
westfly 2001-12-20
  • 打赏
  • 举报
回复
//你的pascal代码也太长了吧,为什么不优化一下呢?
//下面代码将一个小于10000的金额转换为银行形式
//westfly(原创于2001-12-20 语言JavaScript)
function floatToRMB(f)
{
var sNumberMap="零壹贰叁肆伍陆柒捌玖";
var sBitMap="分角元拾佰仟"; // 假定金额不超过9999.99元
var sDigits=Math.floor(Math.abs(f*100)).toString();
var iLen=sDigits.length;
var sRet='';
for(var i=0;i<iLen;i++)
{
sRet+=sNumberMap.charAt(parseInt(sDigits.charAt(i)))+sBitMap.charAt(iLen-i-1);
}
if(f<0)sRet='负'+sRet;
sRet=sRet.replace('零角零分','整');
return sRet;
}
llcnllcn 2001-12-20
  • 打赏
  • 举报
回复
靠!这有多麻烦啊!

87,996

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧