大写金额

xxaacc 2008-11-08 03:54:04
写合同需要把金额转换成大写,找了一些,都有些错。

谁有比较完美的?
...全文
43840 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
contra_sky 2012-05-02
  • 打赏
  • 举报
回复
收藏了,谢谢
helendesign 2009-12-30
  • 打赏
  • 举报
回复
('零', '壹','貳','叁','肆','伍','陆','柒','捌','玖');
畅高IT外包服务
mygodsos 2008-11-10
  • 打赏
  • 举报
回复
23楼,简单有毛用,都不正确,自己都没测试过就拿来误人子弟
你看看你的结果,我都还没用10000000010000011.123来测试

测试环境:delphi2007 Winxp sp3
100011.123
壹拾零万零仟零佰壹拾壹元壹角贰分
fangsp 2008-11-10
  • 打赏
  • 举报
回复
写个最简单的
function UpperMun(i:Real):string;   
const
d='零壹贰叁肆伍陆柒捌玖分角元拾佰仟万拾佰仟亿十百千';
var
m,k:string;
j:integer;
begin
k:='';
m:=floattostr(int(i*100));
for j:=length(m) downto 1 do
k:=k+d[(strtoint(m[Length(m)-j+1])+1)*2-1]+d[(strtoint(m[Length(m)-j+1])+1)*2]+d[(10+j)*2-1]+d[(10+j)*2];
Result:=k;
end;
birdlonger 2008-11-10
  • 打赏
  • 举报
回复
至于界面 , 就两个textbox 一个Button 自己弄下!
birdlonger 2008-11-10
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace RMM大小写转换
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private string str = "";
private void button1_Click(object sender, EventArgs e)
{
string str1 = textBox1.Text.Trim();
string str2 = Convert.ToDouble(str1).ToString ("f2");
int str2len = str2.Length;
for (int i = str2len ; i > 0; i--)
{
if (i==3)
continue ;
changetobig(i, Convert.ToInt16(str2.Substring(str2len-i, 1)), str2);
}
this.textBox2.Text = str;

}
private void changetobig(int weishu ,int value,string strsource)
{

#region //处理相应的数值
switch (value)
{
case 0:
str += "";
break;
case 1:
str += "壹";
break;
case 2:
str += "贰";
break;
case 3:
str += "叁";
break;
case 4:
str += "肆";
break;
case 5:
str += "伍";
break;
case 6:
str += "陆";
break;
case 7:
str += "柒";
break;
case 8:
str += "捌";
break;
case 9:
str += "玖";
break;
default:
break;
}
#endregion
#region 处理相应的单位
switch (weishu)
{
case 1:
if (value !=0)
str+="分";
break ;
case 2:
if (value !=0)
str+="角";
break;
case 3:
break;
case 4:
if ((value == 0 && strsource.Length == 4) || ((strsource.Length > 7) && (Convert.ToDouble(strsource.Substring(strsource.Length - 7, 4)) == 0)))
str += "";
else
str += "元";
break;
case 5:
if (value != 0)
str += "十";
break;
case 6:
if (value != 0)
str += "百";
break;
case 7:
if (value != 0)
str += "千";
break;
case 8:
if ((value == 0 && strsource.Length == 8) || ((strsource.Length > 11) && (Convert.ToDouble(strsource.Substring(strsource.Length - 11, 4)) == 0)))
str += "";
else
str += "万";
break;
case 9:
if (value != 0)
str += "十";
break;
case 10:
if (value != 0)
str += "百";
break;
case 11:
if (value != 0)
str += "千";
break;
case 12:
if ((value == 0 && strsource.Length == 12) || ((strsource.Length > 15) && (Convert.ToDouble(strsource.Substring(strsource.Length - 15, 4)) == 0)))
str += "";
else
str += "亿";
break;
case 13:
if (value != 0)
str += "十";
break;
case 14:
if (value != 0)
str += "百";
break;
default:
break;

}
#endregion

}

}
}

自己写的调试通过,不过没有写输入验证(以确认有效字符那块),可以满足千亿以内的数值转换,估计写合同也足够了吧!
这个运算速度应该算超快的!总共也就那几步!
僵哥 2008-11-09
  • 打赏
  • 举报
回复
 uses
math;

const mnUnit:WideString ='分角元';
const OtherWords:WideString='整负';
const hzUnit:WideString = '拾佰仟万拾佰仟亿';
const hzNum:WideString='零壹贰叁肆伍陆柒捌玖';

function Money2ChineseCapital2(const Num:double ): WideString;
var
szNum:PWideChar;
i,iLen,iLen2, iNum, iAddZero,ResultCount:Integer;
buff:AnsiString;
buf:PAnsiChar;

dblNum: Double;
begin
SetLength(Result,33*2 + 1);
iAddZero := 0;
if Num < 0.0 then
dblNum := Num * 100.0 + 0.5
else
dblNum := Num * 100.0 - 0.5;

buff := format('%0.0f',[dblNum]);
if Pos(buff,'e')>0 then begin
SetLength(Result,0);
Raise Exception.Create('数值过大!');
Exit;
end;
iLen := Length(buff);
szNum := PWideChar(Result);
buf := PAnsiChar(buff);
if(Num<0.0) then
begin
szNum^:=OtherWords[2];
Inc(szNum);
Inc(buf);
Dec(iLen);
end;

for i:=1 to iLen do
begin
iNum :=Ord(buf^)-48;
Inc(buf);
iLen2 := iLen-i;
if(iNum=0) then
begin
if(((iLen2-2) mod 4)=0) and ((iLen2-3)>0) and (((iLen2>=8) or (iAddZero<3))) then
begin
szNum^ := hzUnit[(iLen2-3) mod 8 + 1];
Inc(szNum);
end;
Inc(iAddZero);
if(iLen>1) and (iLen2=1) and (buff[iLen] <> '0') then
begin
szNum^:=hzNum[1];
Inc(szNum);
end;
end
else
begin
if(((iAddZero>0) and (iLen2>=2)) and (((iLen2-1) mod 4)<>0) or ((iAddZero>=4) and ((iLen2-1)>0))) then
begin
szNum^:=hzNum[1];
Inc(szNum);
end;
szNum^:=hzNum[iNum+1];
Inc(szNum);
iAddZero:=0;
end;
if (iAddZero<1) or (iLen2=2) then
begin
if(iLen-i>=3) then
begin
szNum^:=hzUnit[(iLen2-3) mod 8 + 1];
Inc(szNum);
end
else
begin
szNum^:=mnUnit[(iLen2) mod 3 +1 ];
Inc(szNum);
end;
end;
end;
ResultCount := szNum-PWideChar(Result);
if((Num < 0.0) and (ResultCount - 1 = 0)) or ((Num>=0.0) and (ResultCount=0)) then
begin
szNum^:=hzNum[1];
Inc(szNum);
szNum^:=mnUnit[3];
Inc(szNum);
szNum^:=OtherWords[1];
Inc(szNum);
Inc(ResultCount,3);
end
else
if((Num<0.0) and (buff[iLen+1] ='0')) or ((Num>=0.0) and (buff[iLen] ='0')) then
begin
szNum^:=OtherWords[1];
Inc(ResultCount);
end;

SetLength(Result, ResultCount);
end;
mygodsos 2008-11-09
  • 打赏
  • 举报
回复
zeze,大牛就是大牛
=====
测试环境:delphi2007 Winxp sp3
1000000100011.123
壹万亿零壹拾万零壹拾壹元壹角贰分叁厘
循环50000次,mygodsos耗时:1140
壹万亿零壹拾万零壹拾壹元壹角贰分
循环50000次,unsigned耗时:125
======
虽然比较晦涩,但比我的快那么多,我改改看
僵哥 2008-11-08
  • 打赏
  • 举报
回复
随便搜索一下,漫天都是代码.实现上大同小异.5楼已经给出地址,我就不再贴了.对于Delphi版的,我没有做过效率测试,那个使用的是str := str + str1,有点速度上面的影响.实际上每个数字最多对应的是两个汉字,所以内存可以进行预分配,然后使用move来进行复制,效率就会快很多,当然也可以类似C++版本那样实现(http://blog.csdn.net/unsigned/archive/2008/09/22/2960931.aspx).
僵哥 2008-11-08
  • 打赏
  • 举报
回复
呵呵,多谢楼主让我能够发现问题.看看16楼的代码吧.
僵哥 2008-11-08
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xxaacc 的回复:]
就是那个http://topic.csdn.net/u/20081106/20/bb101db1-a805-4602-8db2-49026e9eede6.html
1楼的函数
[/Quote]
嗯,了解了.那个函数是几年前写的.只对C/C++版的代码做过比较深的测试.
僵哥 2008-11-08
  • 打赏
  • 举报
回复
uses
math;



const mnUnit:WideString ='分角元';
const OtherWords:WideString='整负';
const hzUnit:WideString = '拾佰仟万拾佰仟亿';
const hzNum:WideString='零壹贰叁肆伍陆柒捌玖';

function Money2ChineseCapital2(const Num:double ): WideString;
var
szNum:PWideChar;
i,iLen,iLen2, iNum, iAddZero,ResultCount:Integer;
buff:AnsiString;
buf:PAnsiChar;

dblNum: Double;
begin
SetLength(Result,33*2 + 1);
iAddZero := 0;
if Num < 0.0 then
dblNum := Num * 100.0 + 0.5
else
dblNum := Num * 100.0 - 0.5;

buff := format('%0.0f',[dblNum]);
iLen := Length(buff);
szNum := PWideChar(Result);
buf := PAnsiChar(buff);
if(Num<0.0) then
begin
szNum^:=OtherWords[2];
Inc(szNum);
Inc(buf);
Dec(iLen);
end;

for i:=1 to iLen do
begin
iNum :=Ord(buf^)-48;
Inc(buf);
iLen2 := iLen-i;
if(iNum=0) then
begin
if(((iLen2-2) mod 4)=0) and ((iLen2-3)>0) and (((iLen2>=8) or (iAddZero<3))) then
begin
szNum^ := hzUnit[(iLen2-3) mod 8 + 1];
Inc(szNum);
end;
Inc(iAddZero);
if(iLen>1) and (iLen2=1) then
begin
szNum^:=hzNum[1];
Inc(szNum);
end;
end
else
begin
if(((iAddZero>0) and (iLen2>=2)) and (((iLen2-1) mod 4)<>0) or ((iAddZero>=4) and ((iLen2-1)>0))) then
begin
szNum^:=hzNum[1];
Inc(szNum);
end;
szNum^:=hzNum[iNum+1];
Inc(szNum);
iAddZero:=0;
end;
if (iAddZero<1) or (iLen2=2) then
begin
if(iLen-i>=3) then
begin
szNum^:=hzUnit[(iLen2-3) mod 8 + 1];
Inc(szNum);
end
else
begin
szNum^:=mnUnit[(iLen2) mod 3 +1 ];
Inc(szNum);
end;
end;
end;
ResultCount := szNum-PWideChar(Result);
if((Num < 0.0) and (ResultCount - 1 = 0)) or ((Num>=0.0) and (ResultCount=0)) then
begin
szNum^:=hzNum[1];
Inc(szNum);
szNum^:=mnUnit[3];
Inc(szNum);
szNum^:=OtherWords[1];
Inc(szNum);
Inc(ResultCount,3);
end
else
if((Num<0.0) and (buf[iLen+1] ='0')) or ((Num>=0.0) and (buf[iLen] ='0')) then
begin
szNum^:=OtherWords[1];
Inc(ResultCount);
end;

SetLength(Result, ResultCount);
end;
scutLiu 2008-11-08
  • 打赏
  • 举报
回复
mark
xxaacc 2008-11-08
  • 打赏
  • 举报
回复
xxaacc 2008-11-08
  • 打赏
  • 举报
回复
用的是你第一个函数
xxaacc 2008-11-08
  • 打赏
  • 举报
回复
2007
僵哥 2008-11-08
  • 打赏
  • 举报
回复
如果拿着我为Delphi2009改的,到Delphi2007或以下版本的IDE当中测试,结果肯定是不对的.
僵哥 2008-11-08
  • 打赏
  • 举报
回复
不知道楼主是用的什么版本的IDE
xxaacc 2008-11-08
  • 打赏
  • 举报
回复
测试程序

implementation

{$R *.dfm}
uses Tst_RMBTest;

procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
t:string;
n:Double;
begin
Memo1.Lines.Add('==== hongqi162 失踪的月亮');
s:='1000100011.12';
t:=GetMoneySwitch(s);
Memo1.Lines.Add('小写:'+s);
Memo1.Lines.Add('大写:'+t);
Memo1.Lines.Add('---------');
s:='0.09';
t:=GetMoneySwitch(s);
Memo1.Lines.Add('小写:'+s);
Memo1.Lines.Add('大写:'+t);
Memo1.Lines.Add('---------');
Memo1.Lines.Add('====3150379孒淵');
s:='1000100011.12';
t:=UpperMoney(s);
Memo1.Lines.Add('小写:'+s);
Memo1.Lines.Add('大写:'+t);
Memo1.Lines.Add('---------');
Memo1.Lines.Add('====mygodsos乌龙哈里');
s:='1000100011.12';
t:=NumToRmb(s);
Memo1.Lines.Add('小写:'+s);
Memo1.Lines.Add('大写:'+t);
Memo1.Lines.Add('---------');
s:='0.09';
t:=NumToRmb(s);
Memo1.Lines.Add('小写:'+s);
Memo1.Lines.Add('大写:'+t);
Memo1.Lines.Add('---------');

Memo1.Lines.Add('====unsigned僵哥');
s:='1000100011.12';
n:=StrToFloat(s);
t:=toChineseCapitalMoney(n);
Memo1.Lines.Add('小写:'+s);
Memo1.Lines.Add('大写:'+t);
Memo1.Lines.Add('---------');
s:='101011.12';
n:=StrToFloat(s);
t:=toChineseCapitalMoney(n);
Memo1.Lines.Add('小写:'+s);
Memo1.Lines.Add('大写:'+t);
Memo1.Lines.Add('---------');
s:='0.09';
n:=StrToFloat(s);
t:=toChineseCapitalMoney(n);
Memo1.Lines.Add('小写:'+s);
Memo1.Lines.Add('大写:'+t);
Memo1.Lines.Add('---------');
end;
end.
xxaacc 2008-11-08
  • 打赏
  • 举报
回复
测试结果
==== hongqi162 失踪的月亮
小写:1000100011.12
大写:壹拾亿零壹拾万零壹拾壹.壹貳
---------
小写:0.09
大写:.零玖
---------
====3150379孒淵
小写:1000100011.12
大写:壹拾零亿零仟零佰壹拾零万零仟零佰壹拾壹元壹角贰分
---------
====mygodsos乌龙哈里
小写:1000100011.12
大写:壹拾亿零壹拾万零壹拾壹元壹角贰分
---------
小写:0.09
大写:玖分
---------
====unsigned僵哥
小写:1000100011.12
大写:拾零壹拾壹元壹角贰分
---------
小写:101011.12
大写:佰壹仟零壹拾壹元壹角贰分
---------
小写:0.09
大写:玖分
---------
*****************************************
我用strtofloat把字符串转化成数字,不知道是不是这个影响了unsigned的
lydwei的我不行测试了,太复杂了

只有mygodsos的正确,失踪的月亮的怎么没有后面的元角分之类的
加载更多回复(6)

16,747

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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