:: Visual Foxpro, Foxpro for DOS
Re: 20 декабря 2024 года -> {20.12.2024}
Равиль

Сообщений: 6713
Откуда: Уфа
Дата регистрации: 01.08.2003
akvvohinc
Равиль
Вопрос для меня был решен уже в третьем сообщении.
"Компактность" решения во многом зависит от требований к исходной "строке-дате".
Во всех приведенных примерах между компонентами даты имеются разделители.
Но я бы добавил в перечень допустимых и такие, достаточно часто встречающиеся, варианты:
12дек2024
12дек 24
12 декабря1998

Да, и вариант Равиля будет здесь валиться, если в исходных данных количество слов окажется меньше 2 (2-й элемент останется = .F.):
If Isdigit(laWords[2])

Доброе утро !

Спасибо Сергей (akvvohinc) - допилил - разлепил такие строки.
PS также добавил обработку числового параметра с учетом замечаний Сергея (ssa)



------------------
Тяжело согнать курсором муху с монитора ...




Исправлено 2 раз(а). Последнее : Равиль, 21.12.24 07:39
Ratings: 0 negative/1 positive
Re: 20 декабря 2024 года -> {20.12.2024}
chunihin-df
Автор

Сообщений: 151
Откуда: Тюмень
Дата регистрации: 18.11.2013
Ошибка из соседней темы
?? Str2date("56E1234234")

Наверное, сначала надо отделить числа от не чисел, и только после этого начинать перебор форматов даты

Вот этот фрагмент в начало функции перенести
lnLen = Len(m.tcDate)
llDigital = Isdigit(m.tcDate)
lcTmpDate = Left(m.tcDate,1)
For ln = 2 To m.lnLen
lc = Substr(m.tcDate, m.ln, 1)
If !Empty(m.lc) And Isdigit(m.lc) # m.llDigital
llDigital = Isdigit(m.lc)
lc = [ ] + lc && вставляем пробел
Endif
lcTmpDate = m.lcTmpDate + m.lc
Next
Ratings: 0 negative/0 positive
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
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
Равиль

Сообщений: 6713
Откуда: Уфа
Дата регистрации: 01.08.2003
chunihin-df
Ошибка из соседней темы
?? Str2date("56E1234234")

Наверное, сначала надо отделить числа от не чисел, и только после этого начинать перебор форматов даты

Вот этот фрагмент в начало функции перенести
lnLen = Len(m.tcDate)
llDigital = Isdigit(m.tcDate)
lcTmpDate = Left(m.tcDate,1)
For ln = 2 To m.lnLen
lc = Substr(m.tcDate, m.ln, 1)
If !Empty(m.lc) And Isdigit(m.lc) # m.llDigital
llDigital = Isdigit(m.lc)
lc = [ ] + lc && вставляем пробел
Endif
lcTmpDate = m.lcTmpDate + m.lc
Next

chunihin-df
?? Str2Date("макароны от 20 масло за 200") -> 20.05.2000
?? Str2Date("20 июля какого-то года") -> 20.07.2000
?? Str2Date("20 - мармелад / 24 - шоколад") -> 20.03.2024
?? Str2Date(" от 20 дек2024г.") -> . .

Спасибо за тест ! Поправлю


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
ssa

Сообщений: 13115
Откуда: Москва
Дата регистрации: 23.03.2005
Я тут слегонца тестов добавил и причесал в своём стиле
Ну там совершенно лишние телодвижения поубирал и так, по мелочи...
Clear
?? Str2Date("20 декабря 2024 года")
?? Str2Date("20 декабря 94 года")
?? Str2Date("20/12.2024г.")
?? Str2Date("20 дек 2024г.")
?? Str2Date("20 мая 2024г.")
?? Str2Date("20 мар 2024г.")
?? Str2Date("20 декабря")
?? Str2Date("20-12 2024 года")
?? Str2Date("20.12.24 г.")
?? Str2Date("31 февраля 2024г")
?? Str2Date("12дек2024")
?? Str2Date("12дек 24")
?? Str2Date("12 декабря1998")
?? Str2Date("Счет № 12345-67 от 20 дек2024г.")
?? Str2Date(Date()-Date(1900,1,1) + 1) && ssa - передается число
?? Str2Date(45600) && ssa
?? Str2Date("45600") && ssa
?? Str2Date("макароны от 20 масло за 200")&& -> 20.05.2000
?? Str2Date("20 июля какого-то года")&& -> 20.07.2000
?? Str2Date("20 - мармелад / 24 - шоколад")&& -> 20.03.2024
?? Str2Date(" от 20 дек2024г.")&& -> . .
******************
Function Str2Date
Lparameters tcDate
? m.tcDate, Chr(9)
If Empty(m.tcDate)
Return {}
Endif
Local ld1900
ld1900 = Date(1900,1,1)
If Type([m.tcDate]) = [N] ;
And Between(m.tcDate, Gomonth(Date(),-60)-m.ld1900, Gomonth(Date(),12)-m.ld1900)
*!* передается число в диапазоне (-5 лет +1 год)
Return m.ld1900 + m.tcDate - 1
Endif
If Type([m.tcDate]) = [C] ;
And Transform(Val(m.tcDate))== m.tcDate And Between(Val(m.tcDate), Gomonth(Date(),-60)-m.ld1900, Gomonth(Date(),12)-m.ld1900)
*!* передается число в виде строки в диапазоне (-5 лет +1 год)
Return m.ld1900 + Val(m.tcDate) - 1
Endif
tcDate = Upper(Alltrim(Transform(m.tcDate)))
If [ ОТ ] $ ' '+m.tcDate
tcDate = Alltrim(Strextract(' '+m.tcDate, [ ОТ ]))
Endif
tcDate = Alltrim(Chrtran(m.tcDate, ["./-], [ ])) && заменяю разделители на пробелы
If !Isdigit(m.tcDate) && если первый символ не числовой, то выходим
Return {}
Endif
*!* Разлепим буквы и цифры при необходимости && 21.12.2024 08:08
Local llDigital, lnLen, ln, lc, lcTmpDate
lnLen = Len(m.tcDate)
llDigital = Isdigit(m.tcDate)
lcTmpDate = Left(m.tcDate,1)
For ln = 2 To m.lnLen
lc = Substr(m.tcDate, m.ln, 1)
If !Empty(m.lc) And Isdigit(m.lc) # m.llDigital
llDigital = Isdigit(m.lc)
lc = [ ] + lc && вставляем пробел
Endif
lcTmpDate = m.lcTmpDate + m.lc
Next
tcDate = Alltrim(m.lcTmpDate)
*!* -------------------------
Local lnWords, lnDay, lnMonth, lnYear, ldDate
Local Array laWords[3]
ldDate = {}
Store 0 To lnDay, lnMonth, lnYear
lnWords = Min(3, Getwordcount(m.tcDate)) && беру максимум 3 слова
If lnWords >= 2 && 21.12.2024 08:21
For ln = 1 To m.lnWords
laWords[m.ln] = Getwordnum(m.tcDate, m.ln)
Next
If Empty(laWords[3])
lnYear = Year(Date())
Else
lnYear = Val(laWords[3])
lnYear = m.lnYear%100 + 2000 - Iif(Between(m.lnYear%100, 50, 99), 100, 0)
Endif
If Isdigit(laWords[2])
lnMonth = Val(laWords[2])
Else
Dimension laMonth[12]
laMonth[1] = "ЯНВ"
laMonth[2] = "ФЕВ"
laMonth[3] = "МАР"
laMonth[4] = "АПР"
laMonth[5] = "МАЯ"
laMonth[6] = "ИЮН"
laMonth[7] = "ИЮЛ"
laMonth[8] = "АВГ"
laMonth[9] = "СЕН"
laMonth[10] = "ОКТ"
laMonth[11] = "НОЯ"
laMonth[12] = "ДЕК"
lnMonth = Ascan(laMonth, Left(laWords[2], 3))
Endif
lnDay = Val(laWords[1])
Try &&
ldDate = Date(m.lnYear, m.lnMonth, m.lnDay)
Catch
Endtry
Endif
Return m.ldDate


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/1 positive
Re: 20 декабря 2024 года -> {20.12.2024}
Равиль

Сообщений: 6713
Откуда: Уфа
Дата регистрации: 01.08.2003
ssa
Я тут слегонца тестов добавил и причесал в своём стиле Ну там совершенно лишние телодвижения поубирал и так, по мелочи...

Да, увидел - аккуратно получилось, спасибо Сергей !

правда с массивом ожидаемо провалился Май ..

?? Str2Date("20 май2024г.") && Добавил исключение для "МАЙ"

Clear
?? Str2Date("20 декабря 2024 года")
?? Str2Date("20 декабря 94 года")
?? Str2Date("20/12.2024г.")
?? Str2Date("20 дек 2024г.")
?? Str2Date("20 мая 2024г.")
?? Str2Date("20 мар 2024г.")
?? Str2Date("20 декабря")
?? Str2Date("20-12 2024 года")
?? Str2Date("20.12.24 г.")
?? Str2Date("31 февраля 2024г")
?? Str2Date("12дек2024")
?? Str2Date("12дек 24")
?? Str2Date("12 декабря1998")
?? Str2Date("Счет № 12345-67 от 20 дек2024г.")
?? Str2Date(Date()-Date(1900,1,1) + 1) && ssa - передается число
?? Str2Date(45600) && ssa
?? Str2Date("45600") && ssa
?? Str2Date("макароны от 20 масло за 200") && -> 20.05.2000
?? Str2Date("20 июля какого-то года") && -> 20.07.2000
?? Str2Date("20 - мармелад / 24 - шоколад") && -> 20.03.2024
?? Str2Date(" от 20 дек2024г.") && OK
?? Str2Date("20 май2024г.") && Добавил исключение для "МАЙ"
?? Str2Date(Date()) && дата - OK
******************
Function Str2Date
Lparameters tcDate
? m.tcDate, Chr(9)
If Empty(m.tcDate)
Return {}
Endif
If Type([m.tcDate]) = [D]
Return m.tcDate
Endif
Local ld1900
ld1900 = Date(1900,1,1)
If Type([m.tcDate]) = [N] ;
And Between(m.tcDate, Gomonth(Date(),-60)-m.ld1900, Gomonth(Date(),12)-m.ld1900)
*!* передается число в диапазоне (-5 лет +1 год)
Return m.ld1900 + m.tcDate - 1
Endif
If Type([m.tcDate]) = [C] ;
And Transform(Val(m.tcDate))== m.tcDate And Between(Val(m.tcDate), Gomonth(Date(),-60)-m.ld1900, Gomonth(Date(),12)-m.ld1900)
*!* передается число в виде строки в диапазоне (-5 лет +1 год)
Return m.ld1900 + Val(m.tcDate) - 1
Endif
tcDate = Upper(Alltrim(Transform(m.tcDate)))
If [ ОТ ] $ ' '+m.tcDate
tcDate = Alltrim(Strextract(' '+m.tcDate, [ ОТ ]))
Endif
tcDate = Alltrim(Chrtran(m.tcDate, ["./-], [ ])) && заменяю разделители на пробелы
If !Isdigit(m.tcDate) && если первый символ не числовой, то выходим
Return {}
Endif
*!* Разлепим буквы и цифры при необходимости && 21.12.2024 08:08
Local llDigital, lnLen, ln, lc, lcTmpDate
lnLen = Len(m.tcDate)
llDigital = Isdigit(m.tcDate)
lcTmpDate = Left(m.tcDate,1)
For ln = 2 To m.lnLen
lc = Substr(m.tcDate, m.ln, 1)
If !Empty(m.lc) And Isdigit(m.lc) # m.llDigital
llDigital = Isdigit(m.lc)
lc = [ ] + lc && вставляем пробел
Endif
lcTmpDate = m.lcTmpDate + m.lc
Next
tcDate = Alltrim(m.lcTmpDate)
*!* -------------------------
Local lnWords, lnDay, lnMonth, lnYear, ldDate
Local Array laWords[3]
ldDate = {}
Store 0 To lnDay, lnMonth, lnYear
lnWords = Min(3, Getwordcount(m.tcDate)) && беру максимум 3 слова
If lnWords >= 2 && 21.12.2024 08:21
For ln = 1 To m.lnWords
laWords[m.ln] = Getwordnum(m.tcDate, m.ln)
Next
If Empty(laWords[3])
lnYear = Year(Date())
Else
lnYear = Val(laWords[3])
lnYear = m.lnYear%100 + 2000 - Iif(Between(m.lnYear%100, 50, 99), 100, 0)
Endif
If Isdigit(laWords[2])
lnMonth = Val(laWords[2])
Else
*!* Исключение для "МАЙ"
If laWords[2] = "МАЙ" && 21.12.2024 18:18
lnMonth = 5
Else
Dimension laMonth[12]
laMonth[1] = "ЯНВ"
laMonth[2] = "ФЕВ"
laMonth[3] = "МАР"
laMonth[4] = "АПР"
laMonth[5] = "МАЯ"
laMonth[6] = "ИЮН"
laMonth[7] = "ИЮЛ"
laMonth[8] = "АВГ"
laMonth[9] = "СЕН"
laMonth[10] = "ОКТ"
laMonth[11] = "НОЯ"
laMonth[12] = "ДЕК"
lnMonth = Ascan(laMonth, Left(laWords[2], 3))
Endif
*!*
Endif
lnDay = Val(laWords[1])
Try &&
ldDate = Date(m.lnYear, m.lnMonth, m.lnDay)
Catch
Endtry
Endif
Return m.ldDate


------------------
Тяжело согнать курсором муху с монитора ...




Исправлено 3 раз(а). Последнее : Равиль, 21.12.24 16:54
Ratings: 0 negative/1 positive
Re: 20 декабря 2024 года -> {20.12.2024}
chunihin-df
Автор

Сообщений: 151
Откуда: Тюмень
Дата регистрации: 18.11.2013
Что-то начинаю переживать за mistral ai, попросил сгенерировать все необходимые тесты для функции превращения строки в дату, а горшочек все никак не хочет прекращать варить

Часть текста скрыта
ASSERT ParseStringToDate("10-10-2020/05/06/07/08/09/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34/35/36/37") = .F., "Test 164 Failed"
ASSERT ParseStringToDate("10-10-2020.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37") = .F., "Test 165 Failed"
ASSERT ParseStringToDate("10-10-2020-05-06-07-08-09-10-11-12-13-14-15-16-17-18-19-20-21-22-23-24-25-26-27-28-29-30-31-32-33-34-35-36-37-38") = .F., "Test 166 Failed"
ASSERT ParseStringToDate("10-10-2020 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38") = .F., "Test 167 Failed"
ASSERT ParseStringToDate("10-10-2020/05/06/07/08/09/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34/35/36/37/38") = .F., "Test 168 Failed"

Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
akvvohinc

Сообщений: 4720
Откуда: Москва
Дата регистрации: 11.11.2008
Немного мелочовки:
- заменить TYPE на VARTYPE (почти в 2 раза быстрее)
- заменить UPPER(ALLTRIM(TRANSFORM(...))) на TRANSFORM(), которая сама умеет делать и ALLTRIM(), и UPPER():
TRAN('  йцуКЕнг  ','@!T')

Что ещё?
Все разделители не предусмотришь (я бы добавил бэкслэш, запятую и апостроф) - можно добавить строку разделителей как опциональный параметр.
Допустимый диапазон наверняка тоже не всегда будет [-5..+1].
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
Равиль

Сообщений: 6713
Откуда: Уфа
Дата регистрации: 01.08.2003
chunihin-df
Что-то начинаю переживать за mistral ai, попросил сгенерировать все необходимые тесты для функции превращения строки в дату, а горшочек все никак не хочет прекращать варить

это типа ИИ ?


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
chunihin-df
Автор

Сообщений: 151
Откуда: Тюмень
Дата регистрации: 18.11.2013
Ну да, ИИ из топора какое-то, полдня пытаюсь заставить его написать что-то похожее на функцию разбора строки в дату, память как у рыбки по 10 раз одни и те же ошибки исправляем
Ratings: 0 negative/0 positive
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
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
Равиль

Сообщений: 6713
Откуда: Уфа
Дата регистрации: 01.08.2003
akvvohinc
Немного мелочовки:
- заменить TYPE на VARTYPE (почти в 2 раза быстрее)
- заменить UPPER(ALLTRIM(TRANSFORM(...))) на TRANSFORM(), которая сама умеет делать и ALLTRIM(), и UPPER():
TRAN('  йцуКЕнг  ','@!T')

Что ещё?
Все разделители не предусмотришь (я бы добавил бэкслэш, запятую и апостроф) - можно добавить строку разделителей как опциональный параметр.
Допустимый диапазон наверняка тоже не всегда будет [-5..+1].

Спасибо за подсказку по Transform() и разделителям

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


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
chunihin-df
Автор

Сообщений: 151
Откуда: Тюмень
Дата регистрации: 18.11.2013
?? Str2Date("01.01.101") возвращает DATE(2001, 1, 1) почему-то
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
Равиль

Сообщений: 6713
Откуда: Уфа
Дата регистрации: 01.08.2003
chunihin-df
?? Str2Date("01.01.101") возвращает DATE(2001, 1, 1) почему-то

Ага, поправил
lnYear = IIF(m.lnYear<100, m.lnYear%100 + 2000 - Iif(Between(m.lnYear%100, 50, 99), 100, 0), m.lnYear)



------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
of63

Сообщений: 26603
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Я VALTOTIP везде рекламировал, никакой реакции, все решают сами и снова. И это правильно! )
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
chunihin-df
Автор

Сообщений: 151
Откуда: Тюмень
Дата регистрации: 18.11.2013
of63
Я VALTOTIP везде рекламировал, никакой реакции, все решают сами и снова. И это правильно! )

Хорошая функция, в фоксе как раз не хватает функции обратной к 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
Ratings: 0 negative/0 positive
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
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
akvvohinc

Сообщений: 4720
Откуда: Москва
Дата регистрации: 11.11.2008
TAS
Еще вариант:
Непонятно, чего именно это ещё один вариант.
Ведь задача этой темы - "дату в виде строки" превратить в "дату", а не наоборот.

PS
А с какой целью последняя функция для пары месяцев возвращает пробел в конце названия?
TAS
возвращает наименование месяца в нужном падеже
Не в нужном, а лишь в одном из двух (трёх)



Исправлено 1 раз(а). Последнее : akvvohinc, 23.12.24 16:56
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
lemenev

Сообщений: 314
Дата регистрации: 23.06.2022
Хорошая функция безотносительно к теме обсуждения. Но при следующих параметрах она выдаёт неверные данные.

? REP_PERNAME("200913", 'Q') && 5 квартал 2009 г.
? REP_PERNAME("20093", 'H') && 3 полугодие 2009 г.
? REP_PERNAME("200913", 'H') && 3 полугодие 2009 г.

Т.е. нужен контроль входных параметров.

Кроме того, по правилам русского языка название месяца следует писать с маленькой буквы. Названия месяцев пишутся с большой буквы, только если речь идет о праздниках (8 Марта, 1 Мая).
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
of63

Сообщений: 26603
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Олег, ты уже не первый раз выкладываешь эту функцию, и каждый раз тебе говорят, что она сама по себе не работает, так как в ней используются внешние переменные. Вряд ли кто-то станет изучать совсем не маленький код, прежде чем попробует, насколько она подходит для его нужд.
Но вот попробовать-то как раз и нельзя.

Так вы сейчас и занимаетесть рукоприкладными процедурами друг другу ) И все они, при нетривиальных случаях будут усложняться. Я довел эти превращения до каксвоего предела. Изучайте (че там изучать-то!), куча CASE тип+входной тип_выходной, и внутри CASE преобразование типа в другой тип. Внешних переменных там нет, есть очевидные #DEFINE. Вы даже не спросили, каких "внешних переменных" не хватило...
Ratings: 0 negative/0 positive


Эта тема закрыта.

On-line: 13 (Гостей: 13)

© 2000-2025 Fox Club 
Яндекс.Метрика