| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
Равиль Автор Сообщений: 6713 Откуда: Уфа Дата регистрации: 01.08.2003 |
Доброе утро ! Спасибо Сергей (akvvohinc) - допилил - разлепил такие строки. PS также добавил обработку числового параметра с учетом замечаний Сергея (ssa) ------------------ Тяжело согнать курсором муху с монитора ... Исправлено 2 раз(а). Последнее : Равиль, 21.12.24 07:39 |
| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
chunihin-df Сообщений: 151 Откуда: Тюмень Дата регистрации: 18.11.2013 |
Ошибка из соседней темы
?? Str2date("56E1234234") Наверное, сначала надо отделить числа от не чисел, и только после этого начинать перебор форматов даты Вот этот фрагмент в начало функции перенести
|
| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
chunihin-df Сообщений: 151 Откуда: Тюмень Дата регистрации: 18.11.2013 |
?? Str2Date("макароны от 20 масло за 200") -> 20.05.2000
?? Str2Date("20 июля какого-то года") -> 20.07.2000 ?? Str2Date("20 - мармелад / 24 - шоколад") -> 20.03.2024 ?? Str2Date(" от 20 дек2024г.") -> . . ![]() Исправлено 3 раз(а). Последнее : chunihin-df, 21.12.24 09:53 |
| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
Равиль Автор Сообщений: 6713 Откуда: Уфа Дата регистрации: 01.08.2003 |
Спасибо за тест ! Поправлю ![]() ------------------ Тяжело согнать курсором муху с монитора ... |
| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
ssa Сообщений: 13115 Откуда: Москва Дата регистрации: 23.03.2005 |
Я тут слегонца тестов добавил и причесал в своём стиле
Ну там совершенно лишние телодвижения поубирал и так, по мелочи...
------------------ Лень - это неосознанная мудрость. |
| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
Равиль Автор Сообщений: 6713 Откуда: Уфа Дата регистрации: 01.08.2003 |
Да, увидел - аккуратно получилось, спасибо Сергей !
правда с массивом ожидаемо провалился Май .. ?? Str2Date("20 май2024г.") && Добавил исключение для "МАЙ"
------------------ Тяжело согнать курсором муху с монитора ... Исправлено 3 раз(а). Последнее : Равиль, 21.12.24 16:54 |
| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
chunihin-df Сообщений: 151 Откуда: Тюмень Дата регистрации: 18.11.2013 |
|
| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
akvvohinc Сообщений: 4711 Откуда: Москва Дата регистрации: 11.11.2008 |
Немного мелочовки:
- заменить TYPE на VARTYPE (почти в 2 раза быстрее) - заменить UPPER(ALLTRIM(TRANSFORM(...))) на TRANSFORM(), которая сама умеет делать и ALLTRIM(), и UPPER(): TRAN(' йцуКЕнг ','@!T')
Что ещё? Все разделители не предусмотришь (я бы добавил бэкслэш, запятую и апостроф) - можно добавить строку разделителей как опциональный параметр. Допустимый диапазон наверняка тоже не всегда будет [-5..+1]. |
| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
Равиль Автор Сообщений: 6713 Откуда: Уфа Дата регистрации: 01.08.2003 |
|
| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
chunihin-df Сообщений: 151 Откуда: Тюмень Дата регистрации: 18.11.2013 |
Ну да, ИИ из топора какое-то, полдня пытаюсь заставить его написать что-то похожее на функцию разбора строки в дату, память как у рыбки по 10 раз одни и те же ошибки исправляем
|
| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
chunihin-df Сообщений: 151 Откуда: Тюмень Дата регистрации: 18.11.2013 |
Ну и со скобками там совсем беда
Оно в принципе не может нормально написать вот это IF LEN(laParts[1]) = 4 OR (LEN(laParts[1]) = 2 AND LEN(laParts[3]) = 2) AND lcSeparator = "-") Уже все варианты перепробовало, но упорно не может поставить AND lcSeparator = "-" внутрь скобок Если прямо указать как надо, то оно забывает на следующих итерациях как надо написать и снова выносит AND lcSeparator = "-" за скобки Исправлено 1 раз(а). Последнее : chunihin-df, 21.12.24 18:24 |
| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
Равиль Автор Сообщений: 6713 Откуда: Уфа Дата регистрации: 01.08.2003 |
Спасибо за подсказку по Transform() и разделителям
А диапазон буду уменьшать... в моей задаче должны загружаться свежие документы. Полезно вернуть пустую дату, чтобы обратили внимание. ------------------ Тяжело согнать курсором муху с монитора ... |
| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
chunihin-df Сообщений: 151 Откуда: Тюмень Дата регистрации: 18.11.2013 |
?? Str2Date("01.01.101") возвращает DATE(2001, 1, 1) почему-то
|
| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
Равиль Автор Сообщений: 6713 Откуда: Уфа Дата регистрации: 01.08.2003 |
|
| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
of63 Сообщений: 26589 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Я VALTOTIP везде рекламировал, никакой реакции, все решают сами и снова. И это правильно! )
|
| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
chunihin-df Сообщений: 151 Откуда: Тюмень Дата регистрации: 18.11.2013 |
Хорошая функция, в фоксе как раз не хватает функции обратной к TRANSFORM, этакой UNTRANSFORM VALTOTIP могла бы ей быть, но есть несколько вопросов 1) Не работает из коробки Чтобы заставить работать, надо как минимум вот это добавить #DEFINE nbsp CHR(160) #DEFINE ТЧК "." 2) Не хватает примеров использования 3) Не хватает форматов DD MON YY, DD MON YYY 4) Ошибки опять же исправить Например ? VALTOTIP('10.10.101', 'DD.MM.YYYY') -> 10.10.01 ? VALTOTIP('10.01.101', 'DD.MM.YY') -> 10.01.10 5) Поддержка cFormatCodes функции TRANSFORM |
| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
TAS Сообщений: 861 Откуда: Москва Дата регистрации: 28.09.2000 |
Еще вариант:
? REP_DATAPROP(CTOD('01.01.2000'))
*############################################################################################
*############################################################################################
*############################################################################################
FUNCTION REP_DATAPROP && выводит дату прописью - {01.01.2000} в виде "01 января 2000 г."
PARAMETERS tmpdata
RETURN CHRTRAN(STR(DAY(m.tmpdata),2)," ","0")+" "+REP_GET_MES(MONTH(m.tmpdata),1)+" "+STR(YEAR(m.tmpdata),4)+" г."
*############################################################################################
*############################################################################################
*############################################################################################
FUNCTION REP_PERNAME && описание периода, заданного в виде строки '200501'
PARAMETERS period_now,period_cfg
* period_now - строка в виде "200901" (год+месяц) или "20091" (год+номер квартала или полугодия)
* period_cfg - доп настройка
* Q - квартал
* H - полугодие
*-ПРИМЕР ЗАПУСКА ----------------------------------------------------------------------------
* ? REP_PERNAME("200903")
*--------------------------------------------------------------------------------------------
IF VARTYPE(m.period_cfg)#"C"
period_cfg=''
ENDIF
IF INLIST(VARTYPE(m.period_now),"D","T")
period_now=LEFT(DTOS(m.period_now),6)
ENDIF
LOCAL ret_pername
IF EMPTY(m.period_now)
period_now=LEFT(DTOS(DATE()),6)
ELSE
period_now=LEFT(m.period_now,6)
ENDIF
DO CASE
CASE "H"$m.period_cfg
ret_pername=IIF(LEN(m.period_now)=5,RIGHT(m.period_now,1),STR(CEILING(VAL(RIGHT(m.period_now,2))/6),1))+' полугодие '+LEFT(m.period_now,4)+" г."
CASE "Q"$m.period_cfg
ret_pername=IIF(LEN(m.period_now)=5,RIGHT(m.period_now,1),STR(CEILING(VAL(RIGHT(m.period_now,2))/3),1))+' квартал '+LEFT(m.period_now,4)+" г."
CASE "P"$m.period_cfg && падеж - январь > января
ret_pername=REP_GET_MES(VAL(RIGHT(m.period_now,2)),1)+' '+LEFT(m.period_now,4)+" г."
OTHERWISE
ret_pername=REP_GET_MES(VAL(RIGHT(m.period_now,2)))+' '+LEFT(m.period_now,4)+" г."
ENDCASE
RETURN m.ret_pername
*############################################################################################
*############################################################################################
*############################################################################################
FUNCTION REP_GET_MES && возвращает наименование месяца в нужном падеже
PARAMETERS mes_nom,kak && ret_mes - номер месяца, kak =0/1, 1 - в виде января и т.д.
*-ПРИМЕР ЗАПУСКА ----------------------------------------------------------------------------
* ? REP_GET_MES(1)
*--------------------------------------------------------------------------------------------
IF VARTYPE(m.kak)#'N'
kak=0
ENDIF
LOCAL ret_mes
ret_mes=''
DIMENSION naim_mes(12)
naim_mes(1)="Январь"
naim_mes(2)="Февраль"
naim_mes(3)="Март "
naim_mes(4)="Апрель"
naim_mes(5)="Май"
naim_mes(6)="Июнь"
naim_mes(7)="Июль"
naim_mes(8)="Август "
naim_mes(9)="Сентябрь"
naim_mes(10)="Октябрь"
naim_mes(11)="Ноябрь"
naim_mes(12)="Декабрь"
ret_mes=naim_mes(m.mes_nom)
IF m.kak=1
IF INLIST(m.mes_nom,3,8)
ret_mes=LEFT(m.ret_mes,LEN(m.ret_mes)-1)+"а"
ELSE
ret_mes=LEFT(m.ret_mes,LEN(m.ret_mes)-1)+"я"
ENDIF
ENDIF
RETURN m.ret_mes
|
| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
akvvohinc Сообщений: 4711 Откуда: Москва Дата регистрации: 11.11.2008 |
Непонятно, чего именно это ещё один вариант. Ведь задача этой темы - "дату в виде строки" превратить в "дату", а не наоборот. PS А с какой целью последняя функция для пары месяцев возвращает пробел в конце названия? Не в нужном, а лишь в одном из двух (трёх) ![]() Исправлено 1 раз(а). Последнее : akvvohinc, 23.12.24 16:56 |
| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
lemenev Сообщений: 314 Дата регистрации: 23.06.2022 |
Хорошая функция безотносительно к теме обсуждения. Но при следующих параметрах она выдаёт неверные данные.
Т.е. нужен контроль входных параметров. Кроме того, по правилам русского языка название месяца следует писать с маленькой буквы. Названия месяцев пишутся с большой буквы, только если речь идет о праздниках (8 Марта, 1 Мая). |
| Re: 20 декабря 2024 года -> {20.12.2024} | |
|---|---|
|
of63 Сообщений: 26589 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
> Олег, ты уже не первый раз выкладываешь эту функцию, и каждый раз тебе говорят, что она сама по себе не работает, так как в ней используются внешние переменные. Вряд ли кто-то станет изучать совсем не маленький код, прежде чем попробует, насколько она подходит для его нужд.
Но вот попробовать-то как раз и нельзя. Так вы сейчас и занимаетесть рукоприкладными процедурами друг другу ) И все они, при нетривиальных случаях будут усложняться. Я довел эти превращения до каксвоего предела. Изучайте (че там изучать-то!), куча CASE тип+входной тип_выходной, и внутри CASE преобразование типа в другой тип. Внешних переменных там нет, есть очевидные #DEFINE. Вы даже не спросили, каких "внешних переменных" не хватило... |
| © 2000-2025 Fox Club  |