Delphi 中如何取字符?然后把字符相减。
比如,“辽宁省沈阳市铁西区”要把前3个汉字去掉,得到结果为“沈阳市铁西区”。还有大家有没有遇到过,用Delphi编程查询Excel表时,查询结果显示在StringGrid...
比如,“辽宁省沈阳市铁西区”要把前3个汉字去掉,得到结果为“沈阳市铁西区”。
还有大家有没有遇到过,用Delphi编程查询Excel表时,查询结果显示在StringGrid或者DBGrid空间上,结果最后是有个问号的,比如 “所属小学”字段中的一条记录,被显示成了 “中华小学?”所有记录都是如此。回答对,一条就给分! 展开
还有大家有没有遇到过,用Delphi编程查询Excel表时,查询结果显示在StringGrid或者DBGrid空间上,结果最后是有个问号的,比如 “所属小学”字段中的一条记录,被显示成了 “中华小学?”所有记录都是如此。回答对,一条就给分! 展开
2个回答
展开全部
并非如楼上所述那么简单。
第一个问题,需要看delphi是什么版本:要是2009及其以后的版本,缺省的字符和字符串都采用unicode字符集编码,字符数组(可以把字符串视为字符数组)中一个元素就是一个字符,对于英文或国标汉字都是这样,对于“辽宁省沈阳市铁西区”这个串,用Copy函数从第4个开始取就能得到“沈阳市铁西区”了;要是delphi 7或者delphi 2006等早于2009的版本,字符和字符串采用的编码还是传统的ANSI风格,一个汉字在字符数组中需要用两个元素来表示,同样去掉前三个汉字,就需要Copy( AString, 1 + 3 * 2, Length( AString ) )。
第二个问题,怀疑?本是回车、换行、制表符等控制字符,想去掉它,粗鲁的办法可以照楼上的,只取Length-1个,精细的方法是过滤掉每个字符串中的控制字符,即循环处理每个字符串,如果某个元素的编码小于32(空格的编码),就去掉它,这个过滤函数可参考如下,这个函数尽量追求执行效率,所以写法上看得有些繁琐,但比简单的一个个字符叠加要快6、7倍。
function DelCtrlChars( sSource : string ) : string;
var
i, J, L : Integer;
begin
L := Length( sSource );
SetLength( Result, L ); // 假定sSource中没有控制字符,那么结果的长度和sSource相同
if L = 0 then
Exit;
J := 0; // 结果串中字符下标
for i := 1 to L do
if sSource[i] >= #$20 then // 如果普通字符,就采纳它,否则不收集
begin
Inc( J );
Result[J] := sSource[i];
end;
if ( J > 0 ) and ( J < L ) then // 不全是但确实有一些控制字符,重新设置结果串的准确长度
SetLength( Result, J );
end;
第一个问题,需要看delphi是什么版本:要是2009及其以后的版本,缺省的字符和字符串都采用unicode字符集编码,字符数组(可以把字符串视为字符数组)中一个元素就是一个字符,对于英文或国标汉字都是这样,对于“辽宁省沈阳市铁西区”这个串,用Copy函数从第4个开始取就能得到“沈阳市铁西区”了;要是delphi 7或者delphi 2006等早于2009的版本,字符和字符串采用的编码还是传统的ANSI风格,一个汉字在字符数组中需要用两个元素来表示,同样去掉前三个汉字,就需要Copy( AString, 1 + 3 * 2, Length( AString ) )。
第二个问题,怀疑?本是回车、换行、制表符等控制字符,想去掉它,粗鲁的办法可以照楼上的,只取Length-1个,精细的方法是过滤掉每个字符串中的控制字符,即循环处理每个字符串,如果某个元素的编码小于32(空格的编码),就去掉它,这个过滤函数可参考如下,这个函数尽量追求执行效率,所以写法上看得有些繁琐,但比简单的一个个字符叠加要快6、7倍。
function DelCtrlChars( sSource : string ) : string;
var
i, J, L : Integer;
begin
L := Length( sSource );
SetLength( Result, L ); // 假定sSource中没有控制字符,那么结果的长度和sSource相同
if L = 0 then
Exit;
J := 0; // 结果串中字符下标
for i := 1 to L do
if sSource[i] >= #$20 then // 如果普通字符,就采纳它,否则不收集
begin
Inc( J );
Result[J] := sSource[i];
end;
if ( J > 0 ) and ( J < L ) then // 不全是但确实有一些控制字符,重新设置结果串的准确长度
SetLength( Result, J );
end;
展开全部
其实很简单,delphi有字符截取函数LeftStr, MidStr, RightStr
这几个函数都包含在StrUtils中,所以需要uses StrUtils;
假设字符串是 Dstr := '辽宁省沈阳市铁西区', 那么
LeftStr(Dstr, 3) := ’辽宁省’
MidStr(Dstr, 4,3) := ’沈阳市' //4代表从第四个取,3代表取3个字符
RightStr(Dstr, 3) := '铁西区'
你就可以用midstr(Dstr, 4,100)就可以了,100足够取到最后一位了
关于问号的问题,如果总是最后一位也好解决,用Length(Str)函数取的字符长总长度,然后用LeftStr(Dstr,( Length(Str)-1))//这里我没测试,如果这样写语法不对,你就把Length(Str)-1赋值给一个变量即可。
这几个函数都包含在StrUtils中,所以需要uses StrUtils;
假设字符串是 Dstr := '辽宁省沈阳市铁西区', 那么
LeftStr(Dstr, 3) := ’辽宁省’
MidStr(Dstr, 4,3) := ’沈阳市' //4代表从第四个取,3代表取3个字符
RightStr(Dstr, 3) := '铁西区'
你就可以用midstr(Dstr, 4,100)就可以了,100足够取到最后一位了
关于问号的问题,如果总是最后一位也好解决,用Length(Str)函数取的字符长总长度,然后用LeftStr(Dstr,( Length(Str)-1))//这里我没测试,如果这样写语法不对,你就把Length(Str)-1赋值给一个变量即可。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询