// days360 int KCells::days360(const QDate& _date1, const QDate& _date2, bool european) { int day1, month1, year1, day2, month2, year2; day1 = _date1.day(); month1 = _date1.month(); year1 = _date1.year(); day2 = _date2.day(); month2 = _date2.month(); year2 = _date2.year(); return days360(day1, month1, year1, QDate::isLeapYear(_date1.year()), day2, month2, year2, QDate::isLeapYear(_date2.year()), !european); }
BOOL EVAL::EvalFunction(INT nFunction, INT argc, double * argv, double * pValue) { switch( nFunction ) { case EVAL_FUNCTION_ABS: if( argc == 1 ) { * pValue = fabs( argv[0] ); return TRUE; } break; case EVAL_FUNCTION_MOD: if( argc == 2 ) { * pValue = fmod( argv[0], argv[1] ); return TRUE; } break; case EVAL_FUNCTION_CEIL: if( argc == 1 ) { * pValue = ceil( argv[0] ); return TRUE; } break; case EVAL_FUNCTION_FLOOR: if( argc == 1 ) { * pValue = floor( argv[0] ); return TRUE; } break; case EVAL_FUNCTION_ROUND: if( argc == 1 ) { * pValue = floor( argv[0] + 0.5 ); return TRUE; } break; case EVAL_FUNCTION_MIN: if( argc == 2 ) { * pValue = argv[0] < argv[1] ? argv[0] : argv[1]; return TRUE; } break; case EVAL_FUNCTION_MAX: if( argc == 2 ) { * pValue = argv[0] > argv[1] ? argv[0] : argv[1]; return TRUE; } break; case EVAL_FUNCTION_ACOS: if( argc == 1 ) { * pValue = acos(argv[0]); return TRUE; } break; case EVAL_FUNCTION_ASIN: if( argc == 1 ) { * pValue = asin(argv[0]); return TRUE; } break; case EVAL_FUNCTION_ATAN: if( argc == 1 ) { * pValue = atan(argv[0]); return TRUE; } break; case EVAL_FUNCTION_ATAN2: if( argc == 2 ) { * pValue = atan2(argv[0], argv[1]); return TRUE; } break; case EVAL_FUNCTION_COS: if( argc == 1 ) { * pValue = cos(argv[0]); return TRUE; } break; case EVAL_FUNCTION_SIN: if( argc == 1 ) { * pValue = sin(argv[0]); return TRUE; } break; case EVAL_FUNCTION_TAN: if( argc == 1 ) { * pValue = tan(argv[0]); return TRUE; } break; case EVAL_FUNCTION_COSH: if( argc == 1 ) { * pValue = cosh(argv[0]); return TRUE; } break; case EVAL_FUNCTION_SINH: if( argc == 1 ) { * pValue = sinh(argv[0]); return TRUE; } break; case EVAL_FUNCTION_TANH: if( argc == 1 ) { * pValue = tanh(argv[0]); return TRUE; } break; case EVAL_FUNCTION_EXP: if( argc == 1 ) { * pValue = exp(argv[0]); return TRUE; } break; case EVAL_FUNCTION_LOG: if( argc == 1 ) { * pValue = log(argv[0]); return TRUE; } break; case EVAL_FUNCTION_LOG10: if( argc == 1 ) { * pValue = log10(argv[0]); return TRUE; } break; case EVAL_FUNCTION_POW: if( argc == 2 ) { * pValue = pow(argv[0], argv[1]); return TRUE; } break; case EVAL_FUNCTION_SQR: if( argc == 1 ) { * pValue = argv[0] * argv[0]; return TRUE; } break; case EVAL_FUNCTION_SQRT: if( argc == 1 ) { * pValue = sqrt(argv[0]); return TRUE; } break; case EVAL_FUNCTION_TODAY: if( argc == 0 ) { * pValue = (double)today(); return TRUE; } break; case EVAL_FUNCTION_YEARDAYS: if( argc == 1 ) { * pValue = (double)yeardays((int)argv[0]); return TRUE; } break; case EVAL_FUNCTION_MONTHDAYS: if( argc == 2 ) { * pValue = (double)monthdays((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_DATE2DAYS: if( argc == 1 ) { * pValue = (double)date2days((int)argv[0]); return TRUE; } break; case EVAL_FUNCTION_DAYS2DATE: if( argc == 1 ) { * pValue = (double)days2date((int)argv[0]); return TRUE; } break; case EVAL_FUNCTION_EOMDAY: if( argc == 2 ) { * pValue = (double)eomday((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_EOMDATE: if( argc == 2 ) { * pValue = (double)eomdate((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_WEEKDAY: if( argc == 1 ) { * pValue = (double)weekday((int)argv[0]); return TRUE; } break; case EVAL_FUNCTION_ISBIZDATE: if( argc == 1 ) { * pValue = (double)isbizdate((int)argv[0], HDC_SUNSAT ); return TRUE; } if( argc == 2 ) { * pValue = (double)isbizdate((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_NBIZDATE: if( argc == 1 ) { * pValue = (double)nbizdate((int)argv[0], HDC_SUNSAT ); return TRUE; } if( argc == 2 ) { * pValue = (double)nbizdate((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_PBIZDATE: if( argc == 1 ) { * pValue = (double)pbizdate((int)argv[0], HDC_SUNSAT ); return TRUE; } if( argc == 2 ) { * pValue = (double)pbizdate((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_ADDDAYS: if( argc == 2 ) { * pValue = (double)adddays((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_ADDMONTHS: if( argc == 2 ) { * pValue = (double)addmonths((int)argv[0], (int)argv[1], EMR_ACTUAL ); return TRUE; } if( argc == 3 ) { * pValue = (double)addmonths((int)argv[0], (int)argv[1], (int)argv[2]); return TRUE; } break; case EVAL_FUNCTION_ADDTERMS: if( argc == 3 ) { * pValue = (double)addterms((int)argv[0], (int)argv[1], (int)argv[2], EMR_ACTUAL ); return TRUE; } if( argc == 4 ) { * pValue = (double)addterms((int)argv[0], (int)argv[1], (int)argv[2], (int)argv[3]); return TRUE; } break; case EVAL_FUNCTION_DAYS360: if( argc == 2 ) { * pValue = (double)days360((int)argv[0], (int)argv[1], 0 /* USA */ ); return TRUE; } if( argc == 3 ) { * pValue = (double)days360((int)argv[0], (int)argv[1], (int)argv[2]); return TRUE; } break; case EVAL_FUNCTION_DAYS365: if( argc == 2 ) { * pValue = (double)days365((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_DAYSACT: if( argc == 2 ) { * pValue = (double)daysact((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_DAYSBET: if( argc == 2 ) { * pValue = (double)daysbet((int)argv[0], (int)argv[1], DCB_ACTACT ); return TRUE; } if( argc == 3 ) { * pValue = (double)daysbet((int)argv[0], (int)argv[1], (int)argv[2]); return TRUE; } break; case EVAL_FUNCTION_MONTHSBET: if( argc == 2 ) { * pValue = (double)monthsbet((int)argv[0], (int)argv[1]); return TRUE; } break; case EVAL_FUNCTION_TERMSBET: if( argc == 3 ) { * pValue = (double)termsbet((int)argv[0], (int)argv[1], (int)argv[2]); return TRUE; } break; case EVAL_FUNCTION_TERMFRAC: if( argc == 3 ) { * pValue = termfrac((int)argv[0], (int)argv[1], (int)argv[2], DCB_ACTACT, EMR_ACTUAL ); return TRUE; } if( argc == 4 ) { * pValue = termfrac((int)argv[0], (int)argv[1], (int)argv[2], (int)argv[3], EMR_ACTUAL ); return TRUE; } if( argc == 5 ) { * pValue = termfrac((int)argv[0], (int)argv[1], (int)argv[2], (int)argv[3], (int)argv[4]); return TRUE; } break; case EVAL_FUNCTION_YEARFRAC: if( argc == 2 ) { * pValue = yearfrac((int)argv[0], (int)argv[1], DCB_ACTACT, EMR_ACTUAL ); return TRUE; } if( argc == 3 ) { * pValue = yearfrac((int)argv[0], (int)argv[1], (int)argv[2], EMR_ACTUAL ); return TRUE; } if( argc == 4 ) { * pValue = yearfrac((int)argv[0], (int)argv[1], (int)argv[2], (int)argv[3]); return TRUE; } break; } return FALSE; }
// yearFrac long double KCells::yearFrac(const QDate& refDate, const QDate& startDate, const QDate& endDate, int basis) { QDate date1 = startDate; QDate date2 = endDate; // // calculation // QDate date0 = refDate; // referenceDate if (date2 < date1) { // exchange dates QDate Temp1 = date1; date1 = date2; date2 = Temp1; } int days = date1.daysTo(date2); // kDebug(36002) <<"date1 =" << date1 <<" date2 =" << date2 <<" days =" << days <<" basis =" << basis; long double res = 0; long double peryear = 0; int nYears = 0; switch (basis) { case 1: { nYears = date2.year() - date1.year() + 1; for (int y = date1.year(); y <= date2.year(); ++y) { peryear += QDate::isLeapYear(y) ? 366 : 365; } // less than one year - even if it does span two consequentive years ... if (QDate(date1.year() + 1, date1.month(), date1.day()) >= date2) { nYears = 1; peryear = 365; if (QDate::isLeapYear(date1.year()) && date1.month() <= 2) peryear = 366; else if (QDate::isLeapYear(date2.year()) && date2.month() > 2) peryear = 366; else if (date2.month() == 2 && date2.day() == 29) peryear = 366; } peryear = peryear / (long double) nYears; nYears = 0; break; } case 2: { // Actual/360 peryear = 360; break; } case 3: { // Actual/365 peryear = 365; break; } case 4: { // 30/360 Europe // calc datedif360 (start, end, Europe) days = days360(date1, date2, 1); peryear = 360; break; } default: { // NASD 30/360 //basis = 0; // calc datedif360 (start, end, US) days = days360(date1, date2, 0); peryear = 360; } } res = (long double)(nYears) + (long double)days / (long double) peryear; // kDebug(36002)<<"getYearFrac res="<<res; return res; }