Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2014, 12:27   #1
StE111
Пользователь
 
Регистрация: 16.10.2013
Сообщений: 18
По умолчанию Как в цикле отбросить впереди стоящие нули

Добрый день Господа программисты! подскажите пожалуйста как отбросить впереди стоящие нули, например: 0012 впереди стоящие нули отбрасываем получаем 12 или 0103 на выходе должно получится 103.
Я написал примерно вот такой код но он не робит:
Код:
 if (length(edNumTyre.Text) = 4) then
  begin
    strNumTyre:= edNumTyre.Text;
    for i:= 0 to 3 do
    begin
      if (strNumTyre[i] <> '0') then
      begin
        xTyre:= copy(strNumTyre, i, 4 - i);
        dgTyres.DataSource.DataSet.Locate('ID_TYRES',edNumTyre.Text,
                                  [loCaseInsensitive, loPartialKey]);
        Exit;
      end;
    end;

  end;
StE111 вне форума Ответить с цитированием
Старый 03.12.2014, 12:43   #2
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Если делфи современный, то
Код:
s := s.TrimLeft(['0']);
Если нет, то переписать под себя:
Код:
function TStringHelper.TrimLeft(const TrimChars: array of Char): string;
var
  I, L: Integer;
begin
  L := Self.Length;
  I := 0;
  while (I < L) and (CharInArray(Self[I], TrimChars)) do
    Inc(I);
  if I > 0 then
    Result := Self.SubString(I)
  else
    Result := Self;
end;
StriderX вне форума Ответить с цитированием
Старый 03.12.2014, 12:51   #3
StE111
Пользователь
 
Регистрация: 16.10.2013
Сообщений: 18
По умолчанию

Благодарю за ответ! я разобрался вот код:
Код:
  if (length(edNumTyre.Text) = 4) then
  begin
    strNumTyre:= edNumTyre.Text;
    for i:= 1 to 4 do
    begin
      if (strNumTyre[i] <> '0') then
      begin
        xTyre:= copy(strNumTyre, i, 5 - i);
        dgTyres.DataSource.DataSet.Locate('ID_TYRES', xTyre,
                                  [loCaseInsensitive, loPartialKey]);
        Exit;
      end;
    end;
  end;
StE111 вне форума Ответить с цитированием
Старый 03.12.2014, 13:00   #4
Iron Monk
Форумчанин
 
Аватар для Iron Monk
 
Регистрация: 05.10.2007
Сообщений: 478
По умолчанию

Цитата:
Сообщение от StE111 Посмотреть сообщение
Благодарю за ответ! я разобрался вот код:
Код:
  if (length(edNumTyre.Text) = 4) then
  begin
    strNumTyre:= edNumTyre.Text;
    for i:= 1 to 4 do
    begin
      if (strNumTyre[i] <> '0') then
      begin
        xTyre:= copy(strNumTyre, i, 5 - i);
        dgTyres.DataSource.DataSet.Locate('ID_TYRES', xTyre,
                                  [loCaseInsensitive, loPartialKey]);
        Exit;
      end;
    end;
  end;
Фигасе...
Так не проще?
Код:
procedure TrimChar(const _Ch: Char; var str: string);
begin
      while  Length(str) > 0 do
      if str[1] = _Ch then delete(str, 1, 1) else exit;
end;
Iron Monk вне форума Ответить с цитированием
Старый 03.12.2014, 13:25   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Все ещё проще: IntToStr(StrToInt('0000000000000001 03')) => '103'
Человек_Борща вне форума Ответить с цитированием
Старый 03.12.2014, 13:28   #6
Iron Monk
Форумчанин
 
Аватар для Iron Monk
 
Регистрация: 05.10.2007
Сообщений: 478
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Все ещё проще: IntToStr(StrToInt('0000000000000001 03')) => '103'
Зато универсальность пропала)))
Iron Monk вне форума Ответить с цитированием
Старый 03.12.2014, 13:29   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Все ещё проще
Простота кажущая - значащая часть может просто не впихнуться в integer. И, да, универсальность
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.12.2014, 13:58   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Простота кажущая - значащая часть может просто не впихнуться в integer. И, да, универсальность
Не прокатит, обрезание уже встроено.
Хоть ты 00000000000000000000000000000000000 00000000000000000000000000000000000 0000000000000000000567567 впихни в StrToInt оно все равно выдаст 567567.

Цитата:
И, да, универсальность
Мне лаконичность кода в пользу быстродействия, нравится больше чем захламленность в пользу уникальности кода.
Человек_Борща вне форума Ответить с цитированием
Старый 03.12.2014, 14:21   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

00011111111111
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.12.2014, 15:42   #10
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от Iron Monk Посмотреть сообщение
Фигасе...
Так не проще?
Код:
procedure TrimChar(const _Ch: Char; var str: string);
begin
      while  Length(str) > 0 do
      if str[1] = _Ch then delete(str, 1, 1) else exit;
end;
Считается "bad practice" в смысле дёрганья менеджера памяти - надо, чтобы у него было как можно меньше телодвижений. Сейчас пошла мода на immutable строки, считайте, что никакой делит выполнить в принципе нельзя ибо запрещены изменения источника - только создать копию (а собирательствами должен заниматься какой-нибудь TStringBuilder). Поэтому все алгоритмы переписываются в расчете на работу с immutable.
StriderX вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отбросить пробелы после числа? MishkaSh Помощь студентам 1 04.04.2013 05:52
заменить элементы одномерного массива, стоящие перед минимальным - на нули, а стоящие после максимального - на единицы (Паскаль) Женька Good Помощь студентам 2 01.12.2011 06:22
как заставить VBA не откидывать нули впереди числа kusyusha Microsoft Office Word 3 14.11.2010 22:27
Дано число. Отбросить в нем все цифры, стоящие левее самой правой единицы. SkApY Помощь студентам 5 09.11.2009 20:58
как отбросить целую часть оставив дробную Alex26RusLink Паскаль, Turbo Pascal, PascalABC.NET 1 24.10.2009 11:36