【问题标题】:Delphi FMX Verify if EditText contains Numbers Only?Delphi FMX 验证 EditText 是否仅包含数字?
【发布时间】:2019-05-17 08:05:40
【问题描述】:

我需要根据Edittext.text使用不同的程序

如果Edittext.text的前4个字符是字符串,接下来的4个字符是数字,我需要用字符串的最后4个字符的参数调用ProcessA(value: string);

如果所有 8 个字符都是数字,则使用最后四个数字作为参数调用 ProcessB(value:integer)

例如:如果EditText.TextASDF1234,那么我会打电话给ProcessA 如果EdiText.Text12345678,那么我需要打电话给ProcessB

如果字符串类似于 ASD12345ASDFG1231234567A 或数字为十进制,则显示错误。

我该如何验证?

【问题讨论】:

  • 请写的更详细。
  • @c-在我做的主要问题中我能解释的最好的。请再看一次。

标签: delphi firemonkey delphi-10.3-rio


【解决方案1】:
var
  Text: string;

  function CharInRange(C, FirstC, LastC: char): boolean; inline;
  begin
    Result := (C >= FirstC) and (C <= LastC);
  end;

  function IsDigitsOnly(const S: string;
    FirstIdx, LastIdx: integer): boolean;
  var
    I: integer;
  begin
    for I := FirstIdx to LastIdx do
    begin
      if not CharInRange(S[I], '0', '9') then
      begin
        Result := False;
        Exit;
      end;
    end;
    Result := True;
  end;

  function IsUpcaseLettersOnly(const S: string;
    FirstIdx, LastIdx: integer): boolean;
  var
    I: integer;
    C: char;
  begin
    for I := FirstIdx to LastIdx do
    begin
      C := S[I];
      if not CharInRange(C, 'A', 'Z') then
      begin
        Result := False;
        Exit;
      end;
    end;
    Result := True;
  end;

  procedure BadInput;
  begin
    raise Exception.Create('Bad Input');
  end;

begin
  Text := EditText.Text;
  if Length(Text) <> 8 then
  begin
    BadInput;
  end
  else if IsUpcaseLettersOnly(Text, 1, 4)
          and IsDigitsOnly(Text, 5, 8) then
  begin
    ProcessA(Copy(Text, 5, 4));
  end
  else if IsDigitsOnly(Text, 1, 8) then
  begin
    ProcessB(StrToInt(Copy(Text, 5, 4)));
  end
  else
  begin
    BadInput;
  end;
end;

或者

uses
  ..., System.RegularExpressions;

var
  Text: string;
begin
  Text := EditText.Text;
  // I know this can be done better using a
  // single regex expression with capture groups, 
  // but I don't know the correct code to do that...
  if TRegEx.IsMatch(Text, '^[A-Z]{4}[0-9]{4}$') then
  begin
    ProcessA(Copy(Text, 5, 4));
  end
  else if TRegEx.IsMatch(Text, '^[0-9]{8}$') then
  begin
    ProcessB(StrToInt(Copy(Text, 5, 4)));
  end
  else
  begin
    raise Exception.Create('Bad Input');
  end;
end;

【讨论】:

  • 与其声明2个本地函数,不如使用Systems.Character单元之外的TCharHelper.IsLetter和TCharHelper.IsDigit?
  • @Ancaron 无法在 delphi rio 中解析 System.Character.TCharHelper
  • @Rohn 您不直接使用TCharHelper,而是在Char 变量上调用它的方法,例如:uses System.Character; ... if S[i].IsLetter then ...
  • @Remy 就在上面提到它。也非常感谢您提供替代方案。
  • @Ancaron IsLetterIsDigit 允许 ASCII 范围之外的字母/数字字符
猜你喜欢
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 2021-05-04
  • 1970-01-01
相关资源
最近更新 更多