![]() |
![]() |
![]() |
|
красиво преобразовать номер в названия дня недели | ☑ | ||
---|---|---|---|---|
0
Gray-bird
24.02.09
✎
10:21
|
Есть отчет, куда надо вставить название дня недели в текстовом виде.
Функция НомерДняНедели(<Дата>) возвращает числовой номер дня недели. Понятно, что можно написать код вида: если НомерДняНедели(<Дата>)=1 тогда Д="понедельник"; иначеесли НомерДняНедели(<Дата>)2 тогда Д="вторник"; и т.д., но это, как то не элегантно, тем более эта фигня будет вызываться внутри цикла, при заполнении строк отчета. Есть соображения, более красивого написания? |
|||
1
miki
24.02.09
✎
10:22
|
через СЗ красивше будет
|
|||
2
ДенисЧ
24.02.09
✎
10:22
|
WWWW (НННН), выводит наименование дня недели, соответсвующее указанной дате. Наименования дней недели берутся из файла прописи.
Это из Формат() |
|||
3
Shaman100M
24.02.09
✎
12:24
|
массив можно завести
НаименованиеДняНедели[НомерДняНедели(<Дата>)] |
|||
4
Virusaka_P
24.02.09
✎
12:51
|
Не изобретайте велосипед. Правильный ответ в (2)
Формат(ТекДата,"ДНННН") |
|||
5
Shaman100M
24.02.09
✎
14:56
|
(4) иногда, если ехать оч далеко, его стоит изобрести заново, чтоб по-быстрее ехал, в десятки раз по-быстрее.
|
|||
6
Fragster
гуру
24.02.09
✎
14:59
|
(5) а вот ты и сравни, что быстрее - вычислить номер дня недели, затем получить с помощью если/иначеесли слово, или сразу получить слово?
|
|||
7
Fragster
гуру
24.02.09
✎
15:00
|
кстати говоря, встроенные функции написаны не на внутреннем языке 1с, соответственно, работают в разы быстрее, чем то же самое, но написанное на встроенном языке
|
|||
8
Gray-bird
24.02.09
✎
15:01
|
(6) Зато вариант с если/иначеесли позволяет придумать свои названия для дней недели. :)
Пусть бухгалтера радуются! |
|||
9
Fragster
гуру
24.02.09
✎
15:02
|
(8) да, как и свой файл прописи
|
|||
10
ДенисЧ
24.02.09
✎
15:02
|
(8) Формат тоже позволяет.
|
|||
11
Shaman100M
24.02.09
✎
15:27
|
(6) естественно, прежде чем написать сюда, сравнил.
Процедура Выполнить() Перем А1[7]; А1[1] = "Понедельник"; А1[2] = "Вторник"; А1[3] = "Среда"; А1[4] = "Четверг"; А1[5] = "Пятница"; А1[6] = "Суббота"; А1[7] = "Воскресенье"; Счт1 = _GetPerformanceCounter(); Для М1 = 1 По 20000 Цикл Для М2 = 1 По 7 Цикл ДеньНеделиТекст = ""; КонецЦикла; КонецЦикла; Счт2 = _GetPerformanceCounter(); ПостВремя = Счт2 - Счт1; Счт1 = _GetPerformanceCounter(); Для М1 = 1 По 20000 Цикл Для М2 = 1 По 7 Цикл ДеньНеделиТекст = А1[М2]; КонецЦикла; КонецЦикла; Счт2 = _GetPerformanceCounter(); Сообщить("массив: " + Строка(Счт2 - Счт1 - ПостВремя),); Счт1 = _GetPerformanceCounter(); Для М1 = 1 По 20000 Цикл Для М2 = 1 По 7 Цикл ДеньНеделиТекст = Формат(М2,"ДНННН"); КонецЦикла; КонецЦикла; Счт2 = _GetPerformanceCounter(); Сообщить("формат: " + Строка(Счт2 - Счт1 - ПостВремя),); Счт1 = _GetPerformanceCounter(); Для М1 = 1 По 20000 Цикл Для М2 = 1 По 7 Цикл Если М2 = 1 Тогда ДеньНеделиТекст = "Понедельник"; ИначеЕсли М2 = 2 Тогда ДеньНеделиТекст = "Вторник"; ИначеЕсли М2 = 3 Тогда ДеньНеделиТекст = "Среда"; ИначеЕсли М2 = 4 Тогда ДеньНеделиТекст = "Четверг"; ИначеЕсли М2 = 5 Тогда ДеньНеделиТекст = "Пятница"; ИначеЕсли М2 = 6 Тогда ДеньНеделиТекст = "Суббота"; Иначе ДеньНеделиТекст = "Воскресенье"; КонецЕсли; КонецЦикла; КонецЦикла; Счт2 = _GetPerformanceCounter(); Сообщить("условие: " + Строка(Счт2 - Счт1 - ПостВремя),); КонецПроцедуры |
|||
12
Shaman100M
24.02.09
✎
15:28
|
+ (11) СЗ тоже медленнее будет.
|
|||
13
Gray-bird
24.02.09
✎
15:39
|
(11) И чего в результате получилось?
Какова скорость каждого из вариантов? |
|||
14
Shaman100M
24.02.09
✎
15:42
|
+ (11) да, забыл про НомерДняНедели(). Но его добавление в цикл быстродействия массива существенно не замедлит.
(13) массив: 78 формат: 1358 условие: 323 |
|||
15
Fragster
гуру
24.02.09
✎
15:45
|
а ты прогоняй не на 1-7, а на 01.01.2001 - 31.12.2008 и без внешнего цикла ;)
|
|||
16
Fragster
гуру
24.02.09
✎
15:46
|
(15) а то тест не отражает реальности
|
|||
17
Shaman100M
24.02.09
✎
15:57
|
(16) Да ну? Посмотри на код. Там разница только в конечном методе, влияние цикла исключается.
(15) Утверждать, что на прогоне по реальным датам будет другой результат - то же самое, что и утверждать, что скорость методов НомерДняНедели() и Формат() зависит от значения параметра. ;) |
|||
18
Fragster
гуру
24.02.09
✎
15:58
|
хм... за 500 лет получилось 1,5 секунды - через формат и 0,3 секунды через массив... отсюда вывод - а стоит ли того?
|
|||
19
Fragster
гуру
24.02.09
✎
16:00
|
(17) ну так остаток от деления (НомерДняНедели) - от больших чисел дольше считается...
|
|||
20
Shaman100M
24.02.09
✎
16:19
|
(18) Я ж и говорю, если ехать очень далеко.
Необязательно брать уникальные даты, возьми, например, БД вызовов МТС, там же сотни миллионов записей. А 500 лет это примерно 180тыс. По времени - исключи влияние отладчика. (19) если зависимость и будет, то скорее логарифмическая. |
|||
21
Gray-bird
24.02.09
✎
23:26
|
Может кто объяснит, обнаружился странный эффект.
Ячейка таблицы отчета, если в ней содержится "Лев(Формат(День,"ДНННН"),3)+" "+День" - то в ячейке выводится корректно, три символа дня недели + дата числом. Если же сделать наоборот: День+" +Лев(Формат(День,"ДНННН"),3) - то выводится только числовая дата, полностью игнорируя правую часть формулы. Почему так? |
|||
22
Токс3
24.02.09
✎
23:32
|
(21) Что должно получиться, если к дате прибавить слово?
Вобщем, ставь в начало ""+(тут всё твоё)... |
|||
23
Gray-bird
24.02.09
✎
23:38
|
Да-а-а, избаловала меня 1с автоматической подгонкой типов друг к другу.
Никакой культуры программирования не осталось. Понадеялся, что она типа сама всю ячейку соберет... :) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |