Search code examples
delphidelphi-xe

Determine if string not contain number


I need a little help with a function. What I need to do is determine, if a string contains a number or not. If yes, I need only a number from the string, if not I need a whole word from it.

For example:

If my string is 'xyz 60', I need '60' from it, but if the string is 'xyz', I need the whole string:

  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;

Anyone can help what will be the problem? The Result is always 'xyz60', not '60'. I tried "if not (InString[i] in...), but it did not work, too.


Solution

  • I would use a Regular Expressions, and extend your record with a constructor

    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;
    

    Then only thing left is to call it:

    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;
    

    And show the result:

    enter image description here