:: Visual Foxpro, Foxpro for DOS
номер месяца в формате 99
ProbaSP

Сообщений: 94
Откуда: Урал
Дата регистрации: 28.01.2016
Всем привет!
получаю номер месяца(нужно символьное значение):
ALLTRIM(STR(MONTH(DATE())))
результат - 6 (июнь на сегодняшний день).

Нужно - 06.

есть стандартные функции или нужно небольшую обработку делать(проверять количество символов и добавлять 0)?

или я снова где-то что-то не дочитал...

VFP 9.0 SP2
Ratings: 0 negative/0 positive
Re: номер месяца в формате 99
прошелмимо

Сообщений: 784
Дата регистрации: 21.02.2012
? PADL('6',2,'0')
? PADL('12',2,'0')
Ratings: 0 negative/0 positive
Re: номер месяца в формате 99
прошелмимо

Сообщений: 784
Дата регистрации: 21.02.2012
ALLTRIM(STR(

по рукам ходил, хрясь …

LTRIM(STR(
Ratings: 0 negative/0 positive
Re: номер месяца в формате 99
ProbaSP

Сообщений: 94
Откуда: Урал
Дата регистрации: 28.01.2016
Спасибо!

Ratings: 0 negative/0 positive
Re: номер месяца в формате 99
pasha_usue

Сообщений: 3647
Откуда: Е-бург
Дата регистрации: 06.10.2006
?TRANSFORM(6, "@L 99")
Ratings: 0 negative/0 positive
Re: номер месяца в формате 99
ProbaSP

Сообщений: 94
Откуда: Урал
Дата регистрации: 28.01.2016
Хм, пока не смог разобраться с PADL...
С TRANSFORM вроде получилось.
?TRANSFORM(MONTH(DATE()), "@L 99")
результат - 06. И значение символьное.
Спасибо!
Ratings: 0 negative/0 positive
Re: номер месяца в формате 99
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
ProbaSP
Хм, пока не смог разобраться с PADL...
С TRANSFORM вроде получилось.

Есть еще древний-древний способ.
На FPD многие использовали типа такого:
? RIGHT(STR(100+MONTH(DATE())),2)
Возможно по наследству досталось из доисторических времен.
Потому что по идее TRANSFORM в FPD2 например по идее уже был.

А с падлом выше имелось в виду видимо нечто такое:
? PADL(LTRIM(STR(MONTH(DATE()))),2,'0')
Что в данном случае явно не лучше TRANSFORM.

Вообще же, выражение MONTH(DATE()) обычно как-то не принято вставлять в функции.
Недостаток заметен особенно, когда выражение нужно будет использовать не один раз.
Кроме каких-то случаев, лучше бывает создавать переменную, с нужной областью видимости естественно, присваивая ей нужное выражение.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 2 раз(а). Последнее : Crispy, 28.06.19 20:13
Ratings: 0 negative/0 positive
Re: номер месяца в формате 99
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
CLEAR
LOCAL ln1
FOR ln1 = 1 TO 3
? "v1", p1()
? "v2", p2()
? "v3", p3()
ENDFOR
PROCEDURE p1
LOCAL lnSec, ln1
lnSec = SECONDS()
FOR ln1 = 1 TO 1000000
lcRes = PADL(LTRIM(STR(m.ln1%12+1)), 2, "0")
ENDFOR
RETURN SECONDS() - m.lnSec
ENDPROC
PROCEDURE p2
LOCAL lnSec, ln1
lnSec = SECONDS()
FOR ln1 = 1 TO 1000000
lcRes = TRANSFORM(m.ln1%12+1, "@L 99")
ENDFOR
RETURN SECONDS() - m.lnSec
ENDPROC
PROCEDURE p3
LOCAL lnSec, ln1
lnSec = SECONDS()
FOR ln1 = 1 TO 1000000
lcRes = CHRTRAN(STR(m.ln1%12+1, 2, 0), " ", "0")
ENDFOR
RETURN SECONDS() - m.lnSec
ENDPROC


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: номер месяца в формате 99
katana

Сообщений: 20
Дата регистрации: 17.01.2011
Добрый день.

Игорь, поправьте, пожалуйста, если в чем не прав.

В первом фрагменте из трех предложенных Вами вариантов обработки .. Обязательно ли преобразование первого аргумента функции PADL() в строку?

Т.е. вместо PADL(LTRIM(STR(m.ln1%12+1)), 2, "0")
разве нельзя использовать просто PADL(m.ln1%12+1, 2, "0")

тогда этот вариант становится самым шустрым.

Или я туплю и здесь существуют какие-то нюансы? ?

P.S. Не выпендриваюсь, просто сейчас мне нужно работать с таблицами достаточно большими по числу записей, и любой, казалось бы микроскопический выигрыш, пусть даже тысячные доли секунды, дают ощутимый выигрыш по времени в сумме. Вот и ищу

Спасибо!
Ratings: 0 negative/0 positive
Re: номер месяца в формате 99
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Неявная трансформация это неявная трансформация. Если есть гарантия что на вход будет поступать целое число (например это всегда строго результат MONTH(какая-то-дата)) то можно доверить преобразование и функции PADL.
А если нет, то
lnMonth = 6.0
? PADL(m.lnMonth, 2, "0")


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: номер месяца в формате 99
katana

Сообщений: 20
Дата регистрации: 17.01.2011
В Вашем ответе ни слова не убавить не прибавить.
Понял. Спасибо
Ratings: 0 negative/0 positive
Re: номер месяца в формате 99
medstrах
Автор

Сообщений: 1810
Дата регистрации: 10.06.2019
Igor Korolyov
Неявная трансформация это неявная трансформация. Если есть гарантия что на вход будет поступать целое число (например это всегда строго результат MONTH(какая-то-дата)) то можно доверить преобразование и функции PADL.
Почему бы сразу не чекать ввод/преобразовывать данные к int в таблицах, а не на этапе вычисления?
Ratings: 0 negative/0 positive
Re: номер месяца в формате 99
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Не понял вопроса.
Речь про преобразование некоего "номера месяца" в строку заданного формата. Что есть этот номер месяц, и в каком он виде представлен - не указано.

Если это поле таблицы с типом int, или если это переменная инициализируемая выражением целочисленного типа, или это собственно подставляемое внутрь вызова функции выражение имеющее целочисленный тип (в т.ч. выражение MONTH(дата)) - то нет проблем. В общем же случае, когда там может оказаться и вещественное число, ну надо понимать что неявная трансформация приведёт не совсем к тому результату который ожидается...

Кстати, если речь идёт про преобразование переменной/выражения типа date/datetime, то стоит обратить внимание и на функцию DTOS - мало ли, может быть там на самом деле и год и даже день нужен в таком же дополненном нулями виде - и тогда проще из результата DTOS нужную часть взять, чем сначала выделять месяц, год, день, потом дополнять нулями а потом ещё и обратно склеивать


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 03.07.19 15:52
Ratings: 0 negative/0 positive
Re: номер месяца в формате 99
medstrах
Автор

Сообщений: 1810
Дата регистрации: 10.06.2019
Хранить данные в ожидаемом формате сильно дешевле использования универсальной функции. Данные могут появиться в системе либо в результате пользовательского ввода, либо при импорте. В обоих случаях можно контролировать формат этих данных. Если ожидается, что будет int, а вместо этого прилетает double, то можно конвертировать сразу, либо сругаться.
В общем, это вопрос архитектуры.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

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

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