求:日期转换为中文日期的函数(100分)

  • 主题发起人 主题发起人 andrewang
  • 开始时间 开始时间
A

andrewang

Unregistered / Unconfirmed
GUEST, unregistred user!
如:2001-2-14转换为二00一(二零零一?)年二月十四日,最好返回三个值。
 
label1.caption:=FormatDateTime('yyyy"年"mm"月"dd"日"',date)
 
慢了一步。
 
just use formatdatetime function.
 
terry_lzs的做法不能将2001变换成中文“二零零一”!好象不满足andrewang的要求。

我看只能做一个数组了,将1,2,3...与一,二,三...对应起来!

毕竟希望这事让Delphi自带的函数做有点夸张,你想想语言有很多种,难道它都要
考虑进去?不过听说可以调用API函数(这与你的Windows的版本有关,中文版的则系统
中有“年”,“月”,“日”,但好象也不会将 “1” 转换成 “一”,关于这个
API函数,你可以看《Delphi从入门到精通3.0》一书,上面有个例子。
 
procedure TForm1.DateToChina(D: TDate;
var strY, strM, strD: string);
function NumTOstr(num: integer): string;
var
strNum,str:string;
i:integer;
begin

Result:='';
strNum:=IntToStr(Num);
for i:=1 to length(strNum)do

begin

case StrToInt(copy(strNum,i,1)) of
1:Str:='一';
2:Str:='二';
3:Str:='三';
4:Str:='四';
5:Str:='五';
6:Str:='六';
7:Str:='七';
8:Str:='八';
9:Str:='九';
0:Str:='零';
end;

Result:=Result+Str;
end;

end;

var
Year, Month, Day:Word;
begin

DecodeDate( Date, Year, Month, Day );
strY:=NumTOstr(Year);
strM:=NumTOstr(Month);
strD:=NumTOstr(Day);
end;

//----------------------
例子:
procedure TForm1.Button1Click(Sender: TObject);
var
Year, Month, Day:string;
begin

DateToChina( Date, Year, Month, Day );
Label1.Caption:=Year;
Label2.Caption:=Month;
Label3.Caption:=Day;
end;

//-----------------------------------------
以上再作一点修改,就和你的要求一样了。
 
改动一下:
procedure TForm1.DateToChina(D: TDate;
var strY, strM, strD: string);
function NumTOstr(num: integer): string;
var
strNum,str:string;
i:integer;
begin

Result:='';
strNum:=IntToStr(Num);
for i:=1 to length(strNum)do

begin

case StrToInt(copy(strNum,i,1)) of
1:Str:='一';
2:Str:='二';
3:Str:='三';
4:Str:='四';
5:Str:='五';
6:Str:='六';
7:Str:='七';
8:Str:='八';
9:Str:='九';
0:Str:='零';
end;

Result:=Result+Str;
if (i=1) and (Length(strNum)=2) then
Result:=Result+'十';
//加了一句
end;

end;

var
Year, Month, Day:Word;
begin

DecodeDate( Date, Year, Month, Day );
strY:=NumTOstr(Year);
strM:=NumTOstr(Month);
strD:=NumTOstr(Day);
end;

 
function SimpleConv(Source: Char): String;
begin

case Source of
'0': Result := '零';
'1': Result := '一';
'2': Result := '二';
'3': Result := '三';
'4': Result := '四';
'5': Result := '五';
'6': Result := '六';
'7': Result := '七';
'8': Result := '八';
'9': Result := '九';
end;

end;


function DtoCD(DigitStr: String): String;
var Digit: Integer;
begin

Digit := StrToInt(DigitStr);
case Digit of
0..9: Result := SimpleConv(DigitStr[1]);
10: Result := '十';
11..19: Result := '十'+SimpleConv(DigitStr[2]);
20,30: Result := SimpleConv(DigitStr[1])+'十';
else
Result := SimpleConv(DigitStr[1])+'十'+SimpleConv(DigitStr[2]);
end;

end;


procedure TForm1.Button1Click(Sender: TObject);
var I: Integer;
aYear,aMonth,aDay,Tmp: String;
begin

aYear := FormatDateTime('yyyy',DateTimePicker1.Date);
aMonth := FormatDateTime('m',DateTimePicker1.Date);
aDay := FormatDateTime('d',DateTimePicker1.Date);
for I:=1 to 4do

Tmp := Tmp+SimpleConv(aYear);
aYear := Tmp+'年';
aMonth := DtoCD(aMonth)+'月';
aDay := DtoCD(aDay)+'日';
MessageBox(Handle,PChar(aYear+aMonth+aDay+''),'日期',MB_ICONINFORMATION+MB_OK);
end;


上面的算法已在Delphi5+Win98下调试成功,但由于时间紧,算法未经打磨,还很粗糙,待
时间充足的时候再来精研吧。
 
多人接受答案了。
 
后退
顶部