有一字符串内容如下:
' |&ACNO &|&ITM &|&NAM &|'
问题如下:
请问怎样分别用变量:ACNO,ITM,NAM的值来替代这个字符串中相应的部分,而且
宽度同两个&之间的宽度,不足的补空格。
' |&ACNO &|&ITM &|&NAM &|'
问题如下:
请问怎样分别用变量:ACNO,ITM,NAM的值来替代这个字符串中相应的部分,而且
宽度同两个&之间的宽度,不足的补空格。
procedure TForm1.Button1Click(Sender: TObject);
var
str: string;
ACNO, ITM, NAM: string;
begin
str := ' |&ACNO &|&ITM &|&NAM &|';
ACNO := 'test1';
ITM := 'test2';
NAM := 'test3';
str := StringReplace(str, 'ACNO', ACNO, [rfIgnoreCase]);
str := StringReplace(str, 'ITM', ITM, [rfIgnoreCase]);
str := StringReplace(str, 'NAM', NAM, [rfIgnoreCase]);
Caption := str;
end;
ACNO,ITM,NAM:String;
begin
Format(' |&%s &|&%s &|&%s &|',[ACNO,ITM,NAM]);
end;
‘|&ACNO &|&ITM &|&NAM &|’在应用中是固定不变的,怎能变成‘|&%s &|&%s &|&%s &|’呢?
ft死,我不知道delphi里也有format,项目中用到,偶自己写了一个,第二个参数还是TStringlist,谁用都说不好用,害偶挨了不少骂的说。to 楼主:
说明你的要求,短了补空格,长了呢?截断?
‘|&ACNO &|&ITM &|&NAM &|’是应用中格式文件中
的内容,而格式文件预先定好不能改变的,我的要求是根据格式文件结合变量值生成结果。
to killaoli 长了截断
这就是你不对了,是你没明白人家题的意思,format就是再高级替换,它也只认识替换符,就是说只认识‘|&%s &|&%s &|&%s &|’,但它不认识‘|&ACNO &|&ITM &|&NAM &|’。也许楼主的问题能按你说的解决,但如他所说就有那么一个固定的串‘|&ACNO &|&ITM &|&NAM &|’,你能用format做吗?闻道有先后,术业有专攻,何必语含讥讽,打那么多叹号...
HOHO,打几个叹号就叫讥讽,你想象能力也太丰富了吧!To 楼主
我知道你那是一个固定的字符串!但如果你想做到用变量替换字符串中对应内容最简单的方法就是使用Format函数,但如果使用Format函数你就必须改变字符串的内容,但你就不可以变通一下吗?(我前面那位都已经给了你StringReplace函数,没有必要我在说那么清楚了吧?)如下:
const
cSourceStr:= ' |&ACNO &|&ITM &|&NAM &|';
var
ACNO, ITM, NAM: String;
begin
cSourceStr:= StringReplace(cSourceStr,'ACNO','%s',[rfIgnoreCase]);
//后两个同上
Format(cSource,[ACNO,ITM,NAM]);
end;
所以第一步也只能把对应字符替换成%s
最后才能用Format来替换里面的具体位置上的%s,如果你这里要保证间隔一定,可以这样写
(你使用StringReplace解决不了的宽度问题可以使用Format来解决)const
cSourceStr:= ' |&ACNO &|&ITM &|&NAM &|';
var
ACNO, ITM, NAM: String;
P:Integer;
begin
P:=Pos('ACNO',cSourceStr)
cSourceStr:= StringReplace(cSourceStr,Copy(cSourceStr,P,7),'%-7s',[rfIgnoreCase]);
//后两个同上,三个宽度分别假设为7、5、12,偶现在手头没有Delphi无法调试!
//这里具体赋变量的值,但不要超过长度,否则就截取了
Format(cSourceStr,[ACNO,ITM,NAM]);
end;明白,KillLaoLi?
好了,楼上两位,偶写了个小程序测试了一下,昨晚的代码有个小错误(给常量赋值了……^0^)....下面是单元文件内容,窗体上只放一个按钮,这个楼主的问题全部可以解决(自己试一下!):unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementationfunction ReplaceSubStrWithVar(aACNO,aITM,aNAM:String):String;
var
cSourceStr:String;
P:Integer;
begin
cSourceStr:=' |&ACNO &|&ITM &|&NAM &|';
P:=Pos('ACNO',cSourceStr);
cSourceStr:= StringReplace(cSourceStr,Copy(cSourceStr,P,14),'%-14s',[rfIgnoreCase]);
P:=Pos('ITM',cSourceStr);
cSourceStr:= StringReplace(cSourceStr,Copy(cSourceStr,P,5),'%-5s',[rfIgnoreCase]);
P:=Pos('NAM',cSourceStr);
cSourceStr:= StringReplace(cSourceStr,Copy(cSourceStr,P,31),'%-31s',[rfIgnoreCase]);
Result:=Format(cSourceStr,[aACNO,aITM,aNAM]);
end;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(ReplaceSubStrWithVar('12345','12','1234'));
end;end.
[rfIgnoreCase]表示忽略大小写
Result:=Format(cSourceStr,[aACNO,aITM,aNAM]);
可以在上面我写的那个程序的上面这两行后用ShowMessage来显示一下长度,证明长度不改变(其实没有必要证明)好了,这种问题不用研究这么长时间了
回复 | 推荐 | 收藏 | 专题 | 公告 | 管理 | 保存 | 回复通知 | 关闭窗口
主 题: 关于字符串替代的问题,高分相送!
作 者: fht (问号)
等 级:
信 誉 值: 96
所属论坛: Delphi 基础类
问题点数: 100
回复次数: 20
发表时间: 2003-09-24 22:47:27
有一字符串内容如下:
' |&ACNO &|&ITM &|&NAM &|'
问题如下:
请问怎样分别用变量:ACNO,ITM,NAM的值来替代这个字符串中相应的部分,而且
宽度同两个&之间的宽度,不足的补空格。
回复人: killlaoli(菜鸟) ( ) 信誉:111 2003-09-24 23:09:00 得分:0
用 stringreplace,如:
procedure TForm1.Button1Click(Sender: TObject);
var
str: string;
ACNO, ITM, NAM: string;
begin
str := ' |&ACNO &|&ITM &|&NAM &|';
ACNO := 'test1';
ITM := 'test2';
NAM := 'test3';
str := StringReplace(str, 'ACNO', ACNO, [rfIgnoreCase]);
str := StringReplace(str, 'ITM', ITM, [rfIgnoreCase]);
str := StringReplace(str, 'NAM', NAM, [rfIgnoreCase]);
Caption := str;
end;
to killlaoli(菜鸟)
呵呵,先用stringreplace,再用format?那为什么不只用stringreplace搞定,难道不用format就不算好代码不成?我觉得FS有时间的话还不如考虑考虑人家那个宽度的怎么解决才是...能实现功能就行了,干吗非要钻到一个角里考虑问题,干吗非要用stringreplace,就算写出来了,考虑代码的复杂性没?