Решение с хорошей производительностью выглядит следующим образом (uses Character
):
function RemoveNumbers(const AString: string): string;
var
i, j: integer;
begin
SetLength(result, AString.Length);
j := 0;
for i := 1 to AString.Length do
if not AString[i].IsDigit then
begin
inc(j);
result[j] := AString[i];
end;
SetLength(result, j);
end;
Эта функция использует несколько языковых и библиотечных функций, появившихся после Delphi 7. Чтобы это работало в 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 и поэтому вернет true
для всех цифр Unicode. Например, он вернет true
для
- ٣ (U + 0663: АРАБСКО-ИНДИКАТОРНАЯ ЦИФРА ТРЕТЬЯ),
- ੪ (U + 0A6A: ЦИФРОВАЯ ГУРМУХИ ЧЕТВЕРТАЯ),
- ௫ (U + 0BEB: TAMIL DIGIT FIVE),
- ៥ (U + 17E5: KHMER DIGIT FIVE) и
- ᠗ (U + 1817: СЕМЬ МОНГОЛЬСКОГО ЦИФРА).
Если вы хотите использовать только символы '0'..'9'
как цифры, вы можете использовать модернизированную версию теста Delphi 7:
if not CharInSet(AString[i], ['0'..'9']) then