Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何删除Delphi字母字符串中的数字_String_Delphi_Delphi 7 - Fatal编程技术网

String 如何删除Delphi字母字符串中的数字

String 如何删除Delphi字母字符串中的数字,string,delphi,delphi-7,String,Delphi,Delphi 7,我有一个字符串,我为字母的选择设置了坐标,但有时它们会混淆,我问坐标和数字,如果例如'105DYUDXB28DYU13'完成了'DYUDXBDYU' tmpT.Put:=Trim(MidStr(S,8,6))+Trim(MidStr(S,37,3)); 性能良好的解决方案如下(使用字符)): 此函数使用Delphi7之后引入的一些语言和库功能。要在Delphi 7中实现此功能,您需要稍微重写它: function RemoveNumbers(const AString: string): st

我有一个字符串,我为字母的选择设置了坐标,但有时它们会混淆,我问坐标和数字,如果例如
'105DYUDXB28DYU13'
完成了
'DYUDXBDYU'

tmpT.Put:=Trim(MidStr(S,8,6))+Trim(MidStr(S,37,3));

性能良好的解决方案如下(
使用字符)
):

此函数使用Delphi7之后引入的一些语言和库功能。要在Delphi 7中实现此功能,您需要稍微重写它:

function RemoveNumbers(const AString: string): string;
var
  i, j: integer;
begin
  SetLength(result, Length(AString));
  j := 0;
  for i := 1 to Length(AString) do
    if not (AString[i] in ['0'..'9']) then
    begin
      inc(j);
      result[j] := AString[i];
    end;
  SetLength(result, j);
end;
小字体:
TCharHelper.IsDigit
支持Unicode,因此它将为所有Unicode数字返回
true
。例如,它将为返回
true

  • ٣(U+0663:阿拉伯-印度数字三)
  • ੪ (U+0A6A:GURMUKHI第四位)
  • ௫ (U+0BEB:泰米尔语第五位)
  • ៥ (U+17E5:高棉数字5)和
  • ᠗ (U+1817:蒙古语数字7)
如果您只想将字符
'0'..'9'
视为数字,可以使用Delphi 7测试的现代化版本:

if not CharInSet(AString[i], ['0'..'9']) then

还使用过程和var参数编码:

procedure RemoveNumbers(var Text: String);
var
    Index: Integer;
begin
    for Index := Length(Text) downto 1 do
         if Text[Index] in ['0'..'9']
         then Text := Copy(Text, 1, Index - 1) + Copy(Text, Index + 1, Length(Text) - Index);
end;

var
    Text: String;

begin
    Text := '105DYUDXB28DYU13';
    RemoveNumbers(Text);
    WriteLn(Text);
end.

遍历字符串的字符以生成新字符串。丢弃您不需要的字符。或者,如果您想使其灵活(通过使用用户输入的模式),请使用正则表达式。@Victoria:虽然正则表达式有其用途,但我不认为这是其中之一。正则表达式的性能不如从一个字符串复制到另一个字符串时省略数字的简单循环。IOW:如果你有一个问题,并使用正则表达式来解决它,那么你有两个问题@鲁迪,当然。但这对于用户输入的模式是有好处的(至少对于受过教育的用户:)对不起,这是一个重复,但意识到没有好的答案可以涵盖delphi-7的限制。不确定这是否是完美的。最好循环两次并进行一次分配。因为问题不在于性能,所以我会忽略这一方面。答案当然应该是Delphi 7。此外,Unicode标准是否定义了超过10位数字?@ DavidHeffernan:实际上,<代码> IsDigit < /代码>将考虑比0…9更多的字符作为数字。但所需的语义取决于实际情况,对此我无法了解任何细节。(我确实认为,为了其他可能看到问题的人的利益,提供一个“现代”的解决方案以及适合指定Delphi版本的解决方案是一种很好的做法。)@DavidHeffernan:关于性能,截断字符串肯定不会导致复制它吗?是的,你是对的,但基于Andreas所有的收入,感谢运行另一个堆分配操作。它们可能非常昂贵,尤其是与访问刚被带到缓存中的内存相比。我不知道哪个更快,这取决于使用情况和其他因素。但“完美”是很难证明的。就性能而言,这远远不是最佳的。这将导致在内存中进行大量分配和复制。
procedure RemoveNumbers(var Text: String);
var
    Index: Integer;
begin
    for Index := Length(Text) downto 1 do
         if Text[Index] in ['0'..'9']
         then Text := Copy(Text, 1, Index - 1) + Copy(Text, Index + 1, Length(Text) - Index);
end;

var
    Text: String;

begin
    Text := '105DYUDXB28DYU13';
    RemoveNumbers(Text);
    WriteLn(Text);
end.