Форум » [x]Harbour » DOW() и компания » Ответить

DOW() и компания

Dima: Нет ли какой переключалки в Harbour что бы функции из разряда дней недели Dow() , Cdow() , NtocDow() работали по европейскому стандарту в котором первый день недели понедельник а не в американском где первый день недели воскресение. Понятно что можно свои переходники спаять. PS В пиндостане все ни как у людей

Ответов - 28, стр: 1 2 All

PSP: Дима, так в письменном виде все ж правильно возвращается. Ну и плевать, что четверг - это 5-й день )) Или есть более глубокие причины?

Dima: NtocDow(1) чего вернет ? Прально воскресение а надо понедельник Ну или dwmas:={0,0,0,0,0,0,0} // дни недели stimer->(dbeval({|| dwmas[rusdow(stimer->data_z)]+=1})) пришлось делать RUSDOW ()

PSP: Ну, что поделать, как-то так... )) Я просто учитываю, что sunday is number 1 и фсё... )


Dima: Я думал что коли установка формата даты , например SET DATE TO GERMAN то возможно и есть установка стандарта дней недели что ли )))

PSP: Не, такого нет.

Dima: Собственно делал в "лоб". [pre2] func _dow(c) local n:=dow(c) return if(n==1,7,n-1) [/pre2] А после возник спортивный интерес а нельзя ли сделать короче через % , но что то не срастается и видимо я уже туплю ))) Есть идеи ?

petr707: func _dow(c) local n:=IIF(valtype(c)="D",dow(c-1) ,0) return n

Pasha: Совсем просто и без костылей будет так: func _dow(dt) return ( dt % 7 ) + 1

Dima: petr707 Понял , перемудрил я )) Вот так будет короче func _dow(c) return dow(c-1) Проверка не нужна , функцию юзаю только я и туда 100 % попадет только дата. По началу подумал что отталкиваться надо от результата что выдаст DOW() и после этого с ним сделать что нужно.

Dima: Pasha Паш что то не то ......)) Проверял так [pre2] for i=0 to 7 ? dow(date()+i), _dow(date()+i) next [/pre2]

Pasha: дык сегодня вроде четверг (date()%7+1) как раз будет 4. Не ?

Dima: Pasha [pre2] for i=0 to 7 ? dow(date()+i), _dow(date()+i) next wait func _dow(dt) return ( dt % 7 ) + 1 [/pre2] При выполнении Argument Error % Base 1085

Pasha: Еще короче, то есть эффективнее: [pre2]#pragma BEGINDUMP #include "hbapi.h" HB_FUNC( _DOW ) { hb_retnl( HB_ISDATE(1) ? (hb_pardl(1) % 7) + 1 : 0 ); } #pragma ENDDUMP [/pre2]

Dima: Pasha пишет: Еще короче чудно , ошибка та же

Dima: В операции % делимое должно быть числом а у тебя дата

Haz: Dima пишет: что то не то Дима, велосипед давно изобретен dDate := CTOD( "09/15/90" ) ? DOW( dDate ) // 7 ? CDOW( dDate ) // Saturday ? FT_DAYTOBOW( dDate ) // 6 // change beginning of week to Friday (yeah!) FT_DATECNFG( , 6 ) ? DOW( dDate ) // 7 ? CDOW( dDate ) // Saturday ? FT_DAYTOBOW( dDate ) // 1 https://github.com/vszakats/harbour-core/blob/master/contrib/hbnf/doc/en/daytobow.txt

Dima: Игорь а тест чекануть ;) FT_DATECNFG( , 6 ) for i=0 to 7 ? dow(date()+i), FT_DAYTOBOW(date()+i) next Результат [pre2] 5 6 6 0 7 1 1 2 2 3 3 4 4 5 5 6 [/pre2]

Pasha: я прогнал для xHarbour, там для типа данных D операция % допустима. В Harbour, оказывается, нет. Но вариант на С работает, в С это до лампочки

Dima: Pasha пишет: Но вариант на С работает, в С это до лампочки не работает

Dima: Dima пишет: не работает Сори , убил все OBJ , пересобрал , работает. Глюки Hbmk2 видимо ......... Спасибо !

Dima: Pasha Если не сложно и время есть , можешь релизнуть всех братцев DOW() , ты понял о чем я в Cи варианте ?

Haz: Dima пишет: тест чекануть ;) что не так ? ? dow(date()+i), FT_DAYTOBOW(date()+i) + 1 этим FT_DATECNFG( , 6 ) ты установил в что неделя начинается в ПЯТНИЦУ тогда четверг это 7 вот твой тест с +1 5 7 четверг 6 1 пятница 7 2 суббота 1 3 2 4 3 5 4 6 Надо ставить не пятницу конечно

Dima: Haz Извини что спать не даю ))) Смотри. [pre2] for i=0 to 7 ? dow(date()+i), _dow(date()+i),FT_DAYTOBOW(date()+i) + 1 next wait #pragma BEGINDUMP #include "hbapi.h" HB_FUNC( _DOW ) { hb_retnl( HB_ISDATE(1) ? (hb_pardl(1) % 7) + 1 : 0 ); } #pragma ENDDUMP [/pre2] Результат [pre2] 5 4 5 6 5 6 7 6 7 1 7 1 2 1 2 3 2 3 4 3 4 5 4 5 [/pre2]

Dima: Да виноват надо было FT_DATECNFG( , 2 ) Буду знать. Но вариант Паши мне больше нравится ! ;)

Haz: Dima пишет: Смотри. так проверь Func Main() local i := 0 local dDate := DATE() FT_DATECNFG( , 2 ) for i := 0 to 6 ? dow(date()+i), FT_DAYTOBOW(date()+i)+1 next RETURN NIL у Паши несравнимо эффективнее в этом случае , но FT_ XXXXX() много еще чего могут , прими в копилку ))

Dima: Haz пишет: прими в копилку Понял ! Dima пишет: Если не сложно и время есть , можешь релизнуть всех братцев DOW() , ты понял о чем я в Cи варианте ? Павел это можно сделать ? Хотя бы CDOW , Ntocdow

Pasha: CDOW переделывать смысла нет, т.к. там на вход подается дата, а на выходе - строка Ntocdow - это если на вход дается номер дня недели: #pragma BEGINDUMP #include "hbapi.h" #include "hbapilng.h" HB_FUNC( _DOW ) { hb_retnl( HB_ISDATE(1) ? (hb_pardl(1) % 7) + 1 : 0 ); } HB_FUNC( NTOCDOW ) { int iDow; if( HB_ISNUM(1) ) iDow = hb_parni(1); else iDow = 0; if( iDow >= 1 && iDow <= 7 ) hb_retc_const( hb_langDGetItem( HB_LANG_ITEM_BASE_DAY + ( iDow % 7 ) ) ); else hb_retc(""); } #pragma ENDDUMP А больше там функций вроде бы и нет

Dima: Pasha Да с CDOW() я ошибся и ему все равно какой стандарт. 10 июля 2015 что в Африке пятница , что в Америке ......хоть что то общее ;) Спасибо за NTOCDOW , работает



полная версия страницы