大写年月日的转换(50分)

  • 主题发起人 主题发起人 forlook
  • 开始时间 开始时间
F

forlook

Unregistered / Unconfirmed
GUEST, unregistred user!
年月日转换成大写的函数哪位大虾有呀。
小弟初学DELPHI, 望多指教。
 
再顶顶顶
 
给一个格式出来先
 
年:2002
转为贰零零贰
月:
1 转为零壹 11 转为拾壹
日:
1 转为零壹 11 转为壹拾壹
 
我自己看了一些代码,自己拼凑了一段代码, 其效率性、通用性、可用性可能都得不到保障。
大家可以帮我看看(当前机上无DELPHI,要明天才能测试)

function TForm1.yearTOd(i:Real):string;
const
d='零壹贰叁肆伍陆柒捌玖';
var
m,k:string;
j:integer;
begin

k:='';
m:=floattostr(i);
for j:=length(m)do
wnto 1do

k:=k+d[strtoint(m[j])];
yearTOd:=k;
end;


function TForm1.yueTOd(i:Real):string;
const
d='零壹贰叁肆伍陆柒捌玖';
var
m,k:string;
j:integer;
begin

k:='';
m:=floattostr(i);
if length(m)=1 then
yueTod:='零'+d[strtoint(m)];
if length(m)=2 then
yueTod:='拾'+d[strtoint(m)];
end;

function TForm1.dayTOd(i:Real):string;
const
d='零壹贰叁肆伍陆柒捌玖';
var
m,k:string;
j:integer;
begin

k:='';
m:=floattostr(i);
if length(m)=1 then
dayTod:='零'+d[strtoint(m)];
if length(m)=2 then
dayTod:=d[strtoint(m[0])]+'拾'+d[strtoint(m[1])];
end;
 
看来没人理了
 
不是不理你,而是我昨晚忙。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Mask, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
MaskEdit1: TMaskEdit;
procedure Button1Click(Sender: TObject);
private
function LowToUpper(pDate:String):String;
function MToStr(pMonth:String):String;
function NumToStr(pNum:String):String;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
function TForm1.LowToUpper(pDate: String): String;
var s1,s2:String;
begin
s1:=Copy(PDate,1,4);
s2:=NumToStr(Copy(S1,1,1));
s2:=S2+NumToStr(S1[2]);
s2:=S2+NumToStr(S1[3]);
s2:=S2+NumToStr(S1[4])+'年';
s1:=Copy(PDate,6,2);
s2:=S2+MToStr(S1)+'月';
s1:=Copy(PDate,9,2);
s2:=S2+MToStr(S1)+'日' ;
Result:=S2;
end;

function TForm1.MToStr(pMonth: String): String;
var p:Pchar;
s1,s2:String;
begin
p:=pchar(pMonth);
if p[0]='0' then
s1:='零';
if p[0]='1' then
s1:='拾';
if p[0]='2' then
s1:='贰拾';
if p[0]='3' then
s1:='参拾';
if p[1]<>'0' then
s2:=NumToStr(P[1]);
Result:=S1+S2;
end;

function TForm1.NumToStr(pNum: String): String;
var i:Integer;
s:String;
begin
i:=StrToInt(pNum);
case i of
1:s:='壹';
2:s:='贰';
3:s:='参';
4:s:='肆';
5:s:='伍';
6:s:='陆';
7:s:='柒';
8:s:='捌';
9:s:='九';
0:s:='零';
end;
Result:=s;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=LowToUpper(MaskEdit1.Text);//MaskEdit的EditMask='9999-99-99'
end;

end.
 
试下这个:-)
http://61.132.118.185:8080/dispdocnew.php?id=4360
 
试试我新发布的组件吧,下面是演示程序的输出结果:
http://61.132.118.185:8080/dispdocnew.php?id=4360
相关讨论在:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1766452
普通方法:
两仟零叁年壹月贰拾叁日
银行方法:
贰零零叁年零壹月贰拾叁日
普通方法:
两仟零叁年捌月贰拾叁日
银行方法:
贰零零叁年捌月贰拾叁日
普通方法:
两仟零叁年壹拾壹月贰拾叁日
银行方法:
贰零零叁年壹拾壹月贰拾叁日
普通方法:
两仟零叁年壹拾壹月壹拾日
银行方法:
贰零零叁年壹拾壹月零壹拾日
下面是银行的要求
六、票据的出票日期必须使用中文大写。为防止变造票据的出禀日期,在填写月、
日时,月为壹、贰和壹拾的,日为壹至玖和壹拾、贰拾和叁抬的,应在其前加“零”;
日为抬壹至拾玖的,应在其前加“壹”。如1月15日,应写成零壹月壹拾伍日。再如
10月20日,应写成零壹拾月零贰拾日。
 
如果想省掉11,12等前面的 壹
譬如:
11念 十一月 而不是 一十一月
12念 十二月 而不是 一十二月
可以改动源代码中的函数
原来是
class function TCnDigits.LzhFmtDate(AValue: TDate;
DigitsYear: Boolean): String;
var
yy, mm, dd: Word;
ys: WideString;
rs: WideString;
begin
DecodeDate(AValue, yy, mm, dd);
if DigitsYear then
ys := LzhFmtDigits(IntToStr(yy)) + DtNa[1]
else
ys := LzhFmtInt(yy, True) + DtNa[1];
rs := ys + LzhFmtInt(mm) + DtNa[2] + LzhFmtInt(dd) + DtNa[3];
Result := rs;
end;
改为
class function TCnDigits.LzhFmtDate(AValue: TDate;
DigitsYear: Boolean): String;
var
yy, mm, dd: Word;
ys: WideString;
rs: WideString;
begin
DecodeDate(AValue, yy, mm, dd);
if DigitsYear then
ys := LzhFmtDigits(IntToStr(yy)) + DtNa[1]
else
ys := LzhFmtInt(yy, True) + DtNa[1];
rs := ys + LzhFmtInt(mm,false,true) + DtNa[2] + LzhFmtInt(dd,false,true) + DtNa[3];
Result := rs;
end;
 
LzhFmtInt的第三个参数 SoftTone: Boolean 表示使用更人性化的语音读法
以十位开头,且第一个数字为1的,则省去
130000 念做 十三万 而不是 一十三万
另外,年的读法有两种,数字序列读法和整数读法,而且整数读法中
2xxx年,一般都读做 两千xxxx年 而不是 二千xxxx年
相关讨论
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1766452
 
谢谢谢谢!
这个问题已经解决。 我上面的代码经过修改已经完成功能。只是比较弱智罢了。:)
分数很少,不好意思了。
再次谢谢。
 
后退
顶部