Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Очистка строки от всех символов, кроме цифр, в Delphi: эффективные методы

Delphi , Компоненты и Классы , Библиотеки компонент

Вопрос, поднятый пользователем, заключается в поиске наиболее эффективного способа удаления из строки всех символов, кроме цифр, в среде разработки Delphi. Пользователь предоставил три функции, которые успешно выполняют задачу, но интересуется, есть ли встроенные функции в Delphi или более оптимальные методы для выполнения этой задачи.

Анализ предоставленных функций

Функция 1: Посимвольный проход

Первая функция проходит по всем символам строки и, если символ является цифрой, добавляет его в новую строку.

function RemoveNonNumericChars(const s: string): string;
begin
  Result := '';
  for var i := 1 to Length(s) do
  begin
    if s[i] in ['0'..'9'] then
      Result := Result + s[i];
  end;
end;

Функция 2: Удаление символов

Вторая функция также проходит по символам строки, но в обратном порядке, и удаляет символы, которые не являются цифрами.

function RemoveNonNumericChars(const s: string): string;
begin
  Result := s;
  for var i := Length(Result) downto 1 do
  begin
    if not(Result[i] in ['0'..'9']) then
      Delete(Result, i, 1);
  end;
end;

Функция 3: Использование регулярных выражений

Третья функция использует регулярное выражение для замены всех нецифровых символов на пустую строку.

function RemoveNonNumericChars(const s: string): string;
begin
  var RegEx := TRegEx.Create('[^0-9]');
  Result := RegEx.Replace(s, '');
end;

Подтвержденный ответ

Предложенные функции, хотя и выполняют задачу, имеют недостатки, связанные с изменением длины строки во время выполнения, что влияет на производительность. Для улучшения производительности предлагается предварительно выделить память под результат, что позволяет избежать постоянного изменения длины строки.

function RemoveNonDigits(const S: string): string;
begin
  SetLength(Result, S.Length);
  var LActualLength := 0;
  for var i := 1 to S.Length do
    if CharInSet(S[i],  ['0'..'9']) then
    begin
      Inc(LActualLength);
      Result[LActualLength] := S[i];
    end;
  SetLength(Result, LActualLength);
end;

Чтобы поддерживать поддержку не-Арабических цифр, можно использовать функцию TCharacter.IsDigit.

function RemoveNonDigits(const S: string): string;
begin
  SetLength(Result, S.Length);
  var LActualLength := 0;
  for var i := 1 to S.Length do
    if S[i].IsDigit then
    begin
      Inc(LActualLength);
      Result[LActualLength] := S[i];
    end;
  SetLength(Result, LActualLength);
end;

Для дальнейшего улучшения производительности можно обойти машинное обращение с строками RTL и написать каждый символ напрямую, что ухудшит читаемость кода.

function RemoveNonDigits(const S: string): string;
begin
  SetLength(Result, S.Length);
  var ResChr := PChar(Result);
  var LActualLength := 0;
  for var i := 1 to S.Length do
    if CharInSet(S[i],  ['0'..'9']) then
    begin
      Inc(LActualLength);
      ResChr^ := S[i];
      Inc(ResChr);
    end;
  SetLength(Result, LActualLength);
end;

Заключение

Предложенные оптимизации позволяют улучшить производительность за счет предварительного выделения памяти и прямого обращения к буферу строки. При этом важно помнить о балансе между производительностью и читаемостью кода. В большинстве практических случаев даже медленные методы будут достаточно быстрыми.

Создано по материалам из источника по ссылке.

Вопрос пользователя связан с поиском наиболее эффективного способа очистки строки от всех символов, кроме цифр, в среде разработки Delphi, с учетом анализа предоставленных функций и возможных оптимизаций.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Библиотеки компонент ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-12 07:31:01/0.0033907890319824/0