DateTime.Parse
Дату он легко спарсит, просто дайте ему эту строку. А для времени из 06.13.48 надо специально как то задать. Ну или писать по-человечески, 06:13:48, тогда поймёт что это время.
Если всё же надо парсить с строку с точками во время - ищите на msdn (сайт такой) какие параметры нужно задать.
Почему выдаёт ошибку : Нет перегруженной подпрограммы с такими типами параметров
abs(NumericUpDown2.Value-NumericUpDown1.Value)
Функция abs должно работать со всеми числовыми типами
Ну да. Каждый раз вот так дату разбирать. А еще ее собрать надо, т.е. обратную операцию произвести, как изначально @ahtam просил
На мой взгляд, нормальная работа с датой - это нечто вроде var MyDate=StrToDate(‘19.12.2018’); и var cDate:=DateToStr(MyDate); с учетом текущих региональных настроек операционной системы. А то, что Вы писали - это шаманство, пляски с бубном, серьезную программу для обработки данных с датами так делать - себе дороже.
DateTime.Parse учитывает региональные настройки (в отличии от DateTime.ParseExact). Но почему то считает что русские пишут дату в формате ММ.ДД.ГГГГ )))
В региональных настройках, в частности, указан формат даты, так что “мысли о русских” тут более чем странны: Windows, MS Office и .NET разработаны одной и той же компанией. Вот Office - он действительно учитывает региональные настройки.
На скорую руку набросал функцию поиска “в лоб” символов подстроки в заданной строке как в прямом порядке (не обязательно рядом, просто индекс последнего найденного) и произвольном (тупо удаление символов).
Не оптимально, без гарантий, но пока вроде работает
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(‘123’, ‘asd1qwe2zxc9dgh3’)=True; то есть ищет не всю подстроку, а посимвольно – в прямом (как в запросе) или произвольном порядке?
Был бы важен - было бы достаточно регулярку подсуетить. Или помещать не в 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 ваш вариант
Если Вы ясно и понятно опишете спецификацию функции, которая Вам нужна, возможно мы лучше сумеем Вам помочь. Что касается приведенных Вами измерений, даже семикратный выигрыш во времени в данном случае не играет существенной роли, потому что я пока что не могу представить себе задачи. где такая функция будет нужна сто тысяч раз, да и даже если так, кратность сама по себе ничего не говорит, если, к примеру, Вы выгадали на одиночном вызове даже несколько микросекунд. Сравните трудозатраты на программирование и тогда можно будет говорить, стоило ли оно того.
@Алекс, вы правы, что решение с хешами намного* лаконичней, но одно всегда за счёт другого. Такой вариант с частотными списками я тоже применял, хотя есть два нюанса:
основная задача была вспомнить как элегантно упаковать две подобные функции в одну;
судя по затратам времени на выполнение, объём работ со значительными накладками/оверхед.
Это не проблема, ведь изначально готовые библиотеки/функции “универсальны” для удобства, чтобы не пересоздавать велосипеды, а если нужно что-то своё или лучше, приходится писать или оптимизировать под конкретные задачи. Другое дело, что без знаний нюансов можно легко потеряться в вариантах каждого шага.
Кроме, возможно, шифрования/дешифрования и логических игр со словами, основное применение подобных функций – лингвистика, статистическая лингвистика и обработка довольно крупных текстов (от вариаций SoundEx/MetaPhone и ритмики/мелодичности до пресловутых fuzzy match). Например, вместо искомого (‘123’) может подразумеваться набор аллофонов, грамматическая конструкция (подлежащее+сказуемое+дополнение), просто фонемы же или стилистические приёмы. Хотя и нельзя отрицать, что иногда проще воспользоваться готовыми/подходящими средствами вроде того же RegEx… В общем, пишу свои библиотечки и заготовки