Delphi 确定字符串是否不包含数字

Delphi 确定字符串是否不包含数字,delphi,delphi-xe,Delphi,Delphi Xe,我需要一些功能方面的帮助。我需要做的是确定字符串是否包含数字。如果是,我只需要字符串中的一个数字,如果不是,我需要字符串中的一个完整单词 例如: 如果我的字符串是'xyz 60',我需要它的'60',但是如果字符串是'xyz',我需要整个字符串: function TForm1.FindNumberInString(InString: string): TNumberInString; var i, j: Integer; ST: String; begin

我需要一些功能方面的帮助。我需要做的是确定字符串是否包含数字。如果是,我只需要字符串中的一个数字,如果不是,我需要字符串中的一个完整单词

例如:

如果我的字符串是
'xyz 60'
,我需要它的
'60'
,但是如果字符串是
'xyz'
,我需要整个字符串:

  function TForm1.FindNumberInString(InString: string): TNumberInString;
  var
    i, j: Integer;
    ST: String;
  begin
    Result.TNumber := '';
    Result.TIsNumber := False;

    for i := 1 to Length(InString) do
    begin
      if (InString[i] in ['0'..'9']) then
      begin
        Result.TNumber := Result.TNumber + InString[i];
        Result.TIsNumber := True;
      end else 
        Result.TNumber := InString;
    end;      
  end;

 // TNumberInString is a packed record

 TNumberInString = Packed Record
   TNumber: string;
   TIsNumber: boolean;
 end;

任何人都可以帮忙,有什么问题吗?结果总是
'xyz60'
,而不是
'60'
。我尝试了
“如果没有(在…
中插入[I]),但它也不起作用。

尝试类似的方法:

function TForm1.FindNumberInString(InString: string): TNumberInString;
var
  i, j: Integer;
begin
  Result.TNumber := InString;
  Result.TIsNumber := False;

  for i := 1 to Length(InString) do
  begin
    if InString[i] in ['0'..'9'] then
    begin
      Result.TNumber := InString[i];
      Result.TIsNumber := True;
      For j := i+1 to Length(InString) do
      begin
        if not (InString[i] in ['0'..'9']) then
          Break;
        Result.TNumber := Result.TNumber + InString[j];
      end;
      Exit;
    end;
  end;      
end;

我将使用正则表达式,并使用构造函数扩展您的记录

uses
  RegularExpressions;
{$R *.dfm}

type
  TNumberInString = Packed Record
    TNumber: string;
    TIsNumber: Boolean;
    constructor Create(const Value: String);
  end;

  { TNumberInString }

constructor TNumberInString.Create(const Value: String);
var
  Match: TMatch;
begin
  Match := TRegEx.Create('\d+').Match(Value);
  TIsNumber := Match.Success;
  if TIsNumber then
    TNumber := Match.Value
  else
    TNumber := Value;
end;
那么唯一剩下的就是叫它:

procedure TForm30.FormCreate(Sender: TObject);
begin
  Memo1.Lines.Clear;
  Memo1.Lines.Add(TNumberInString.Create('XYZ').TNumber);
  Memo1.Lines.Add(TNumberInString.Create('XYZ60').TNumber);
  Memo1.Lines.Add(TNumberInString.Create('XYZ 60').TNumber);
end;
并显示结果:


这可能会有所帮助:
if(在['0'..'9']中插入[i])
if(在['0'..'9']中插入[i]非常不同
。你为什么要尝试看似随机的事情?你做过任何调试吗?你在程序执行时检查过程序吗?你学到了什么?为什么要从
0
循环到
Length
?假设你真的在使用XE,字符串是基于1的。为什么要打包记录?这会导致数据不对齐。询问所有对于这些问题,我的建议是,你需要备份一点,然后思考。你认为你需要做的是让这段代码正常工作。但这忽略了大局。大局是你还没有学会如何调试你的代码。这会导致你变得非常困惑,随机尝试代码,感到沮丧等等。让它成为你的目标了解如何调试您的代码。@DavidHeffernan是怎么说的。另外,当InString是时,比如说“2A4”呢?对于您的目的,应该返回2还是24?
0到长度(InString)
,真的吗?