Помощь новичкам

DateTime.Parse Дату он легко спарсит, просто дайте ему эту строку. А для времени из 06.13.48 надо специально как то задать. Ну или писать по-человечески, 06:13:48, тогда поймёт что это время.

Если всё же надо парсить с строку с точками во время - ищите на msdn (сайт такой) какие параметры нужно задать.

Только не забывайте, что дату он рассматривает в формате ММ.ГГ.ДДДД. Для простых смертных работа с датами в .NET - “еще то” удовольствие!

Почему выдаёт ошибку : Нет перегруженной подпрограммы с такими типами параметров abs(NumericUpDown2.Value-NumericUpDown1.Value) Функция abs должно работать со всеми числовыми типами

Используйте System.Math.Abs( ). Свойство NumericUpDown.Value имеет тип Decimal, для которого в PascalABC.NЕТ функция Abs( ) не определена.

ММ.ДД.ГГГГ*

Ничего там сложного, даже для простых смертных:

begin
  var dt := DateTime.ParseExact('26.10.2009','dd.MM.yyyy',nil);
  dt.Day.Print;
  dt.Month.Print;
  dt.Year.Print;
end.

Да, конечно, это описка.

Ну да. Каждый раз вот так дату разбирать. А еще ее собрать надо, т.е. обратную операцию произвести, как изначально @ahtam просил

На мой взгляд, нормальная работа с датой - это нечто вроде var MyDate=StrToDate(‘19.12.2018’); и var cDate:=DateToStr(MyDate); с учетом текущих региональных настроек операционной системы. А то, что Вы писали - это шаманство, пляски с бубном, серьезную программу для обработки данных с датами так делать - себе дороже.

DateTime.Parse учитывает региональные настройки (в отличии от DateTime.ParseExact). Но почему то считает что русские пишут дату в формате ММ.ДД.ГГГГ )))

В региональных настройках, в частности, указан формат даты, так что “мысли о русских” тут более чем странны: Windows, MS Office и .NET разработаны одной и той же компанией. Вот Office - он действительно учитывает региональные настройки.

Дьявол кроется в деталях

1 лайк

На скорую руку набросал функцию поиска “в лоб” символов подстроки в заданной строке как в прямом порядке (не обязательно рядом, просто индекс последнего найденного) и произвольном (тупо удаление символов).

Не оптимально, без гарантий, но пока вроде работает
function sub(const _it: string; _s: string): boolean;
(* поиск подстроки по порядку
sub('123',asd1qwe2zxc9dgh3')=True
sub('123','321')=False
 *)
begin
   sub := false; // результат по умолчанию; ака sub:=1=0;
   
//защита от дурака - "nil" можно искать
   if _it = '' then exit; //nil
   if _s = '' then exit; //nil
   
   var a: byte = 1; // предыдущая позиция
   var b: byte = 0; // найденная позиция
   
   for var i := 1 to _it.length do 
   begin
      b := PosEx(_it[i], _s, a);
      if b = 0 then exit; //не найдено
      if a > b then exit; //не по порядку
      a := b; //обновить позицию
   end;
   sub := true
end;

function subx(const _it: string; _s: string): boolean;
(* поиск подстроки в произвольном порядке
subx('123','as1d3qwe3zxc5asd23')=True
 *)
begin
   subx := false; // результат по умолчанию
   
//защита от дурака
if _it = '' then exit; //nil
if _s = '' then exit; //nil
   
   var a: byte = 1; // найденная позиция
   
   for var i := 1 to _it.length do 
   begin
      a := Pos(_it[i], _s);
      if a = 0 then exit; //не найдено
      Delete(_s, i, 1) // удалить найденный символ
   end;
   subx := true
end;

begin
   var s1: string := '';
   var s2: string := '';
   
   repeat
      s1 := '';
      s2 := '';
      repeat s1:=ReadString('ЧТО= ') until s1>'';
      repeat s2:=ReadString('ГДЕ= ') until s2>'';
      Println(' Sub(', s1, ',', s2, ') =', sub(s1, s2));
      Println('Subx(', s1, ',', s2, ') =', subx(s1, s2));
      Println('- - - - - - - - - - - - - - - - - - - - - - - - ')
   until s2 = '.'
end.

Когда-то смог красиво объединить подобное в одну функцию вида

 sub(const _it:string;_s:string; _order:boolean):boolean
// True - по порядку, False - произвольно

Однако забыл какой алгоритм использовал для оптимизация на универсальность под обе задачи и немного буксую… Может кому-то со стороны виднее где я тупанул или как надо правильно.

Спс

nil и пустая строка - это не одно и то же.

А можно вопрос - зачем, когда есть готовая? Или это программирование ради программирования?

@Алекс, а в какой библиотеке и какая функция возвращает sub(‘123’, ‘asd1qwe2zxc9dgh3’)=True; то есть ищет не всю подстроку, а посимвольно – в прямом (как в запросе) или произвольном порядке?

Да, задумался о своём и неверно выразился (в английском “nil” - ноль, ничто, пусто)

Я даже сначала не понял, что Вы хотите))) Но тогда это легко моделируется.

begin
  var (s, subs) := ('asd1qwe4zxc9dgh3', '123');
  var r := (subs.ToHashSet - s.ToHashSet).Count = 0;
  r.Println
end.
1 лайк

Ну, nil тоже нужно проверять тогда. Кстати, у string есть какой то статичный метод который сразу и на пустоту и на nil проверяет.

На сколько я понял, там ещё важен порядок… Хотя оно всё равно проще делается чем у @NRA.

Я понял, что порядок-то как раз и неважен…

Был бы важен - было бы достаточно регулярку подсуетить. Или помещать не в HashSet, а в SortedSet для лексикографического порядка. А если нужен порядок, как в исходной подстроке - удалить через регулярку несовпадения и сравнить полученные строки.

Благодарю, а какая реализация позволит объединить два-в-одно?

Наверное нюансы подсчёта milliseconds на i5 от аккумулятора:

for var i:=1 to 100000 do z:=sub(subs,s);Println(MillisecondsDelta); // --> ~50 мой вариант
for var i:=1 to 100000 do z:=sub2(subs,s);Println(MillisecondsDelta); // --> ~350  ваш вариант

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

“Если что-то есть, значит кому-то это нужно!”

@Алекс, вы правы, что решение с хешами намного* лаконичней, но одно всегда за счёт другого. Такой вариант с частотными списками я тоже применял, хотя есть два нюанса:

  1. основная задача была вспомнить как элегантно упаковать две подобные функции в одну;
  2. судя по затратам времени на выполнение, объём работ со значительными накладками/оверхед.

Это не проблема, ведь изначально готовые библиотеки/функции “универсальны” для удобства, чтобы не пересоздавать велосипеды, а если нужно что-то своё или лучше, приходится писать или оптимизировать под конкретные задачи. Другое дело, что без знаний нюансов можно легко потеряться в вариантах каждого шага.

Кроме, возможно, шифрования/дешифрования и логических игр со словами, основное применение подобных функций – лингвистика, статистическая лингвистика и обработка довольно крупных текстов (от вариаций SoundEx/MetaPhone и ритмики/мелодичности до пресловутых fuzzy match). Например, вместо искомого (‘123’) может подразумеваться набор аллофонов, грамматическая конструкция (подлежащее+сказуемое+дополнение), просто фонемы же или стилистические приёмы. Хотя и нельзя отрицать, что иногда проще воспользоваться готовыми/подходящими средствами вроде того же RegEx… В общем, пишу свои библиотечки и заготовки