各位大虾,帮我一把,胜造七级佛屠!!!(50分)

  • 主题发起人 主题发起人 newart
  • 开始时间 开始时间
N

newart

Unregistered / Unconfirmed
GUEST, unregistred user!
有关处理字符串的问题!如何将一个数字字符串转换为一个日期或时间字符串?
78.88-----七十八点八八元(字符串长度不固定)
1110十一点十分(字符串长度固定)
20010403二零零一年四月三日(字符串长度固定)
十万火急!如能给我帮助,速回!!!(换季大送分)
最好给我一个自定义的函数!
 
用copy ,pos等函数处理
 
自己救自己
 
我今天倒在一本书上看到这个函数,应该不是很难的
 
money to char倒是有一些现在的函数
 
以日期为例:
const
NumStrs:array[0..9] of string[2] = ('〇','一','二','三','四','五','六','七','八','九');
function SMonOrDay(Day:integer):string;
begin
if Day>=10 then
begin
if Day>=20 then
Result:=NumStrs[Day div 10]+'十'
else
Result:='十';
Day:=Day mod 10;
if Day<>0 then
Result:=Result+NumStrs[Day];
end
else
Result:=NumStrs[Day];
end;
function SYear(Year:integer):string;
var
Temp:integer;
function YDigS(R:integer):string;
begin
if Year>=R then
begin
Result:=NumStrs[Temp div R];
Temp:=Temp mod R

end
else
Result:='';
end;
begin
Temp:=Year;
Result:=YDigS(1000)+YDigS(100)+YDigS(10)+NumStrs[Year mod 10]
end;
function DateToStr(Date:string):string;
begin
Result:=SYear(StrToInt(Copy(Date,1,4)))+'年'+
SMonOrDay(StrToInt(Copy(Date,5,2)))+'月'+
SMonOrDay(StrToInt(Copy(Date,7,2)))+'日';
end;

注:1.没有调试过,仅供参考
2.SYear的参数改为字符串会更简单一些,但不如这个通用
3.时间的转换与此类似
4.货币的转换比较复杂,我有一个专门的货币格式化类和函数的单元,源程序有500行之多
 
对于后两个格式固定的字符串,只要按照一定规则分割,然后依照一个表进行转换
比如11-> 11点, 2000 -> 二零零零年

对于转换货币,就复杂一些,中午有空的时候我会试着写一个看看
 
你还是自己练着写写吧
写这种东西很练手的
不写永远没长进
 
数字换成大写中文
自己写的,不是很完美
有什么问题可别找我:))

const DX: array[0..9] of string[2] = ('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
DW: array[1..3] of string[2] = ('仟', '佰', '拾');
D: array[1..3] of string[3] = ('圆 ', '万 ', '亿 ');


function Convert(s: string): string;
function AZ(s: string): string;
var i: integer;
begin
for i := 1 to 4 - length(s) do
s := '0' + s;
result := s;
end;

function GZN(s: string): integer;
var i: integer;
begin
result := 0;
for i := 1 to 4 do
begin
if S <> '0' then
break;
result := result + 1;
end;
end;

function Cvt(s: string): string;
var flag: boolean;
i: integer;
begin
result := '';
flag := false;
for i := 4 downto 1 do
begin
if flag = false then
if s <> '0' then
flag := true;

if s <> '0' then
if i = 4 then
result := DX[strtoint(s)] + result
else
result := DX[strtoint(s)] + DW + result
else
if (flag) and (i > GZN(s)) then
begin
flag := false;
result := DX[0] + result;
end;
end;
end;
var p: integer;
s1, s2, ss: string;
i, n, l: integer;
f: double;
begin
for i := 1 to length(s) do
if not (s in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.']) then
begin
showmessage('含有非法字符!');
exit
end;
result := '';
p := pos('.', s);
if length(s) - p = 1 then
s := s + '0';

if p = 0 then
s1 := s
else
begin
s1 := copy(s, 1, p - 1);
s2 := copy(s, p + 1, 2);
end;
l := length(s1);
if l > 12 then
begin
showmessage('位数太多!');
exit;
end;
if (l mod 4) = 0 then
n := l div 4
else
n := l div 4 + 1;

for i := 1 to n do
begin
if i < n then
begin
ss := copy(s1, l - 3, 4);
delete(s1, l - 3, 4);
l := length(s1);
end
else
begin
if length(s1) < 4 then
s1 := AZ(s1);
ss := s1;
end;

if strtoint(ss) <> 0 then
result := cvt(ss) + D + result
else if i = 1 then
result := '圆';

end;

if p > 0 then
begin
if s2[1] <> '0' then
result := result + DX[strtoint(s2[1])] + '角'
else
result := result + '零';
if s2[2] <> '0' then
result := result + DX[strtoint(s2[2])] + '分';
end;
end;
 
手上没有Delphi,中午用VC写了一段,但愿对你有帮助,如果看不进去
晚上回家再替你转成Delphi。

这段程序跟楼上的有点像,都是基于查表格的
没有实现小数部分,但是加入对小数的支持很容易,如果不是特别急的
话留给你练练手了

程序基本思路是将数字字串按四位分割,每隔四位从t_unit1表中选择单位
插到数字后,在四位内则从t_unit2表中选择单位,总体流程并不复杂,
需要注意的是对数字0的处理,比如5001是不能转换成五百零零一的,未解决
这个问题,我用了一个标志old_inx_num来判断前面是否已经有了零了。


程序执行

输入 m_szCurrency = 500156736020056
输出 s = 伍佰万壹千伍佰陆拾柒亿叁千陆佰零贰万零伍拾陆园


CString t_unit1[5] = {"园", "万", "亿", "万", "亿"};
CString t_unit2[3] = {"拾", "佰", "千"};
CString t_num[10] = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};

CString s = "";
int old_inx_num = 0;
for ( int i = 0
i < m_szCurrency.GetLength()
i++ )
{
char x = 0;
int inx_num = m_szCurrency[ m_szCurrency.GetLength() - i - 1 ] - '0';
int inx_unit;

if ( i % 4 == 0 )
{
inx_unit = i / 4;
if (inx_num)
{
s = t_num[ inx_num ] + t_unit1[ inx_unit ] + s;
}
else
{
s = t_unit1[ inx_unit ] + s;
}
}
else
{
inx_unit = i % 4 - 1;
if (inx_num)
{
s = t_num[ inx_num ] + t_unit2[ inx_unit ] + s;
}
else
{
if (old_inx_num)
s = t_num[ inx_num ] + s;
}
}
old_inx_num = inx_num;
}
 
关于时间的
很简单
ShortDateFormat := 'yyyy年mm月dd日'
DateToStr(Now)
即可
 
谢了,接受答案了!字符串转化金额还是有一些问题?
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
D
回复
0
查看
484
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部