关于COPY函数的问题(50)

  • 主题发起人 主题发起人 卖女孩的小火柴之二
  • 开始时间 开始时间

卖女孩的小火柴之二

Unregistered / Unconfirmed
GUEST, unregistred user!
是这样的,我用copy('我爱/国际米兰',1,10),去前10个字符的时候,会在‘我爱/国际’后面再加一个?和其它的特殊字符,怎么才能去掉这些特殊的字符也就是说我的字符串是汉字加数字加字母或者还有标点符号,但是我只要求30个字符(即15个汉字的长度或者30个字母或数字等)
 
你要判断你是否取到了多字节字符中间? 如果是, 则可以向前后拷一个,或向后多拷一个.发个函数你可以参考一下:function InterceptLayerName(const ALayerName: string; const ALen: Byte = 20): string;var iLen: Integer; iFrontPos, iBackPos: Integer; iByteType: TMbcsByteType;begin iLen := Length(ALayerName); if iLen > ALen then begin iFrontPos := ALen div 2; // 非单字节字符, 保证不要截到多字节字符的中间, 否则产生乱码 iByteType := ByteType(ALayerName, iFrontPos); while not (iByteType in [mbTrailByte, mbSingleByte]) do begin Inc(iFrontPos); iByteType := ByteType(ALayerName, iFrontPos); end; iBackPos := iLen - (ALen div 2); iByteType := ByteType(ALayerName, iBackPos); while not (iByteType in [mbLeadByte, mbSingleByte]) do begin Dec(iBackPos); iByteType := ByteType(ALayerName, iBackPos); end; Result := Copy(ALayerName, 1, iFrontPos) + Copy(ALayerName, iBackPos, iLen - iBackPos + 1); end else Result := ALayerName;end;
 
没有啊~~要么你用deleteprocedure TForm1.Button1Click(Sender: TObject);var s:string;begin s:='我爱/国际米兰'; delete(s,10,100); EDIT1.Text:=s;end;
 
你用inputbox('','',copy('我爱/国际米兰',1,10))显示看看就可以看到用 delete(s,10,100); 函数可以
 
liuls 给的完全可以解决你的问题了吧
 
procedure TForm1.Button1Click(Sender: TObject);var s : string ;begin s:= '品牌:PED/构造:辐形三角/电介质类质'; inputbox('','',copy(s,1,30)); delete(s,31,100); inputbox('','',s); s := '松下牌/构造:片式/阻值:1KΩ/0.5W' ; inputbox('','',copy(s,1,30)); delete(s,31,100); inputbox('','',s);end;delete 这个函数也不行
 
LZ试试下面的代码:procedure TForm1.btn1Click(Sender: TObject);var S: WideString;begin S := Copy('我爱/国际米兰', 1, 10); InputBox('', '', S);end;
 
szhcracker,procedure TForm1.Button1Click(Sender: TObject);var s : WideString ;begin s:= '品牌:PED/构造:辐形三角/电介质类质'; inputbox('','',copy(s,1,30)); delete(s,31,100); inputbox('','',s); s := '松下牌/构造:片式/阻值:1KΩ/0.5W' ; inputbox('','',copy(s,1,30)); delete(s,31,100); inputbox('','',s);end;这个对字母和数字又不对了第二次将后面的W又取不掉了!
 
同意 szhcracker,
 
LZ没仔细看代码吧?你先把Copy后的内容赋给S再做处理。... S := Copy('我爱/国际米兰', 1, 10); // 先赋值 InputBox('', '', S); // 再处理...你再仔细试试吧,祝你好运。
 
WideString 这个不行我只能要30个字符
 
procedure TForm1.btn1Click(Sender: TObject);var S: WideString;begin S := Copy('品牌:PED/构造:辐形三角/电介质类质', 1, 30); InputBox('', '', S); S := Copy('松下牌/构造:片式/阻值:1KΩ/0.5W', 1, 30); InputBox('', '', S);end;实在不明白LZ的意思,你的'松下牌/构造:片式/阻值:1KΩ/0.5W'字符串取30位的话就是只到5,W是取不到的,因为Ω是2位而不是一位,你要取到W,就得用S := Copy('松下牌/构造:片式/阻值:1KΩ/0.5W', 1, 31);你还搞不定的话,建议你要补习一些基础知识了。
 
“品牌:PED/构造:辐形三角/电介质类质'”这个字符串我只要取到“品牌:PED/构造:辐形三角/电介质”“松下牌/构造:片式/阻值:1KΩ/0.5W”这个字符串只要取到 “松下牌/构造:片式/阻值:1KΩ/0.5”
 
“品牌:PED/构造:辐形三角/电介质类质'”这个字符串我只要取到“品牌:PED/构造:辐形三角/电介质”“松下牌/构造:片式/阻值:1KΩ/0.5W”这个字符串只要取到 “松下牌/构造:片式/阻值:1KΩ/0.5”也就是不管开始字符串又多长,我只要前30个字符。因为数据库只有30个字符的长度啊
 
LZ测试过我代码的结果吗?
 
sourcestring:='哎,那么复杂:';Result:=String(widestrcopy(windestring(sourcestring),1,10));
 
楼上的,请告诉我 WideStrCopy() 函数在哪个单元里,让我学一下。还有 WindeString() 函数你没有写错吧? 应该是 WideString() 吧?我是 D7。觉得被雷倒了,我的代码结果就是LZ所谓的:“品牌:PED/构造:辐形三角/电介质类质'”这个字符串我只要取到“品牌:PED/构造:辐形三角/电介质”“松下牌/构造:片式/阻值:1KΩ/0.5W”这个字符串只要取到 “松下牌/构造:片式/阻值:1KΩ/0.5”现在的人不知道实践,只知道索取或想象,如此浮躁,还想着提高?我不会再回复这个帖子了。祝大家好运!
 
szhcracker 你咋知道我没实践呢!这上面大家提到的方法我都试过了,都不对。有你说的那么简单的话我就不提问了!我的要求是不管字符串有多长,我只要求最长取到30个字符(也就是15个汉字或者30个字母或者数字),因为数据库只有30个字符的长度。
 
TO:卖女孩的小火柴之二 你试试szhcracker的方法,我试过了,就是’松下牌/构造:片式/阻值:1KΩ/0.5‘。
 
TO:火焰领主打伞,取英文字符和数字没问题,问题是当第30个字符是中文的时候就有问题了上面所有人的方法我都试了“松下牌/构造:片式/阻值:1KΩ/0.5W” 这个去前30个字符结果是“松下牌/构造:片式/阻值:1KΩ/0.5” 这个没问题,是我要的结果问题是这个字符串:“品牌:PED/构造:辐形三角/电介质类质” 当它取前30个字符的时候应该取29个 也就是“品牌:PED/构造:辐形三角/电介质”要是结果是这个就正确了,但是上面所有人的方法都是取到这29个字符“品牌:PED/构造:辐形三角/电介质”的最后一个字符“质”周面还跟了个特殊符号,也就是“类”字取了一半的ASCII码,转换过来是乱码了!所以就出问题了!这下大家应该明白我要说的是什么了吧!
 
后退
顶部