QString double2Money( double n ){ static QString cap[4][10] = { { "", "один ", "два ", "три ", "чотири ", "п'ять ", "шість ", "сім ", "вісім ", "дев'ять " }, { "", "одна ", "дві ", "три ", "чотири ", "п'ять ", "шість ", "сім ", "вісім ", "дев'ять " }, { "", "", "двадцять ", "тридцять ", "сорок ", "п'ятдесят ", "шістдесят ", "сімдесят ", "вісімдесят ", "дев'яносто " }, { "", "сто ", "двісти ", "триста ", "чотириста ", "п'ятсот ", "шістсот ", "сімсот ", "вісімсот ", "дев'ятсот " } }; static QString cap2[10] = { "десять ", "одинадцять ", "дванадцять ", "тринадцять ", "чотирнадцять ", "п'ятнадцять ", "шістнадцять ", "сімнадцять ", "вісімнадцять ", "дев'ятнадцять " }; static QString cap3[5][3] = { { "копійка ", "копійки ", "копійок " }, { "гривня, ", "гривні, ", "гривень, " }, { "тисяча ", "тисячі ", "тисяч " }, { "мілльон ", "мильони ", "мільонів " }, { "мілліард ", "мільярди ", "мільярдів " } }; QString s; long nn = ((int)(n)*10000 + (int)(n*1000) % 1000 + 5 ) / 10; long lo = 0; long hi = nn; Q_INT32 r[3]; int rod; for ( int nPor = 0; true; ++nPor ) { QString olds = s; s = ""; lo = hi%1000; hi = hi/1000; if ((nPor == 1) && (lo == 0) && (hi == 0)) { s = "ноль " + cap3[1][2] + olds; break; } for ( int nRaz = 0; nRaz < 3; ++nRaz ) { r[nRaz] = lo%10; lo = lo/10; } switch ( nPor ) { case 0: case 1: case 2: rod = 1; break; default: rod = 0; } QString capt; if (r[1] != 1) { if (r[0] == 1) capt = cap3[nPor][0]; else if ((r[0] > 1 ) && (r[0] < 5)) capt = cap3[nPor][1]; } if (capt.isEmpty()) capt = cap3[nPor][2]; if (nPor == 0) { s = QString::number(r[1]) + QString::number(r[0]) + " " + capt; continue; } s += cap[2+1][r[2]]; s += ((r[1] == 1) ? cap2[r[0]] : cap[1+1][r[1]]+cap[0+rod][r[0]])+capt; s += olds; if ((hi == 0) && (nPor >= 1)) break; } QString up = s[0]; up = up.upper(); s.replace(0,1,up); return s;}
C++ (Qt)QString QextDouble2Money::money( double n ){ if ( n > 999999999999.99 ) return QString::fromUtf8("Очень много денег ..."); if ( n < 0 ) return QString::fromUtf8("Отрицательная сумма !"); static QString cap[4][10] = { { "", QString::fromUtf8("один "), QString::fromUtf8("два "), QString::fromUtf8("три "), QString::fromUtf8("четыре "), QString::fromUtf8("пять "), QString::fromUtf8("шесть "), QString::fromUtf8("семь "), QString::fromUtf8("восемь "), QString::fromUtf8("девять ") }, { "", QString::fromUtf8("одна "), QString::fromUtf8("две "), QString::fromUtf8("три "), QString::fromUtf8("четыре "), QString::fromUtf8("пять "), QString::fromUtf8("шесть "), QString::fromUtf8("семь "), QString::fromUtf8("восемь "), QString::fromUtf8("девять ") }, { "", "", QString::fromUtf8("двадцать "), QString::fromUtf8("тридцать "), QString::fromUtf8("сорок "), QString::fromUtf8("пятьдесят "), QString::fromUtf8("шестьдесят "), QString::fromUtf8("семьдесят "), QString::fromUtf8("восемьдесят "), QString::fromUtf8("девяносто ") }, { "", QString::fromUtf8("сто "), QString::fromUtf8("двести "), QString::fromUtf8("триста "), QString::fromUtf8("четыреста "), QString::fromUtf8("пятьсот "), QString::fromUtf8("шестьсот "), QString::fromUtf8("семьсот "), QString::fromUtf8("восемьсот "), QString::fromUtf8("девятьсот ") } }; static QString cap2[10] = { QString::fromUtf8("десять "), QString::fromUtf8("одиннадцать "), QString::fromUtf8("двенадцать "), QString::fromUtf8("тринадцать "), QString::fromUtf8("четырнадцать "), QString::fromUtf8("пятнадцать "), QString::fromUtf8("шестнадцать "), QString::fromUtf8("семнадцать "), QString::fromUtf8("восемнадцать "), QString::fromUtf8("девятнадцать ") }; static QString cap3[5][3] = { { QString::fromUtf8("копейка "), QString::fromUtf8("копейки "), QString::fromUtf8("копеек ") }, { QString::fromUtf8("рубль, "), QString::fromUtf8("рубля, "), QString::fromUtf8("рублей, ") }, { QString::fromUtf8("тысяча "), QString::fromUtf8("тысячи "), QString::fromUtf8("тысяч ") }, { QString::fromUtf8("миллион "), QString::fromUtf8("милиона "), QString::fromUtf8("миллионов ") }, { QString::fromUtf8("миллиард "), QString::fromUtf8("миллиарда "), QString::fromUtf8("миллиардов ") } }; QString s; qlonglong nn = ((qlonglong)(n)*10000 + (qlonglong)(n*1000) % 1000 + 5 ) / 10; qlonglong lo = 0; qlonglong hi = nn; int r[3]; int rod; for ( int nPor = 0; true; ++nPor ) { QString olds = s; s = ""; lo = hi%1000; hi = hi/1000; if ((nPor == 1) && (lo == 0) && (hi == 0)) { s = QString::fromUtf8("ноль ") + cap3[1][2] + olds; break; } for ( int nRaz = 0; nRaz < 3; ++nRaz ) { r[nRaz] = lo%10; lo = lo/10; } switch ( nPor ) { case 0: case 1: case 2: rod = 1; break; default: rod = 0; } QString capt; if (r[1] != 1) { if (r[0] == 1) capt = cap3[nPor][0]; else if ((r[0] > 1 ) && (r[0] < 5)) capt = cap3[nPor][1]; } if (capt.isEmpty()) capt = cap3[nPor][2]; if (nPor == 0) { s = QString::number(r[1]) + QString::number(r[0]) + " " + capt; continue; } if (nPor == 1) rod = 0; s += cap[2+1][r[2]]; s += ((r[1] == 1) ? cap2[r[0]] : cap[1+1][r[1]]+cap[0+rod][r[0]])+capt; s += olds; if ((hi == 0) && (nPor >= 1)) break; } QString up(s[0]); s.replace(0,1,up); return s;}
void Document::typeSummWithText(double nSumm){ QString sText; unsigned int nBillion, nMillion, nTousands, nHundreds, nTemp; //Миллиарды nBillion = nSumm / 1000000000; if(nBillion > 0) sText += sumAsText(nBillion, 1); //Миллионы nTemp = nSumm - (nBillion * 1000000000); nMillion = nTemp / 1000000; if(nMillion > 0) sText += sumAsText(nMillion, 2); //Тысячи nTemp = nSumm - (nBillion * 1000000000) - (nMillion * 1000000); nTousands = nTemp / 1000; if(nTousands > 0) sText += sumAsText(nTousands, 3); //Сотни nHundreds = nSumm - (nBillion * 1000000000) - (nMillion * 1000000) - (nTousands * 1000); if(nHundreds > 0) sText += sumAsText(nHundreds, 4); sText = sText.trimmed(); sText.replace(0,1,sText.at(0).toUpper()); mf_leditSummaPropis->setText(sText);}QString Document::sumAsText(int nSumm, int nKey){ //nKey - ключ, какая будет использоваться приставка //1 - Милиарды //2 - Миллионы //3 - Тысячи //4 - Рубли QString sSummAsText; int nHIndex = 0; int nDIndex = 0; int nIIndex = 0; QString sHundreds[10] ={trUtf8("") ,trUtf8("сто") ,trUtf8("двести") ,trUtf8("триста") ,trUtf8("четыреста") ,trUtf8("пятьсот") ,trUtf8("шестьсот") ,trUtf8("семьсот") ,trUtf8("восемьсот") ,trUtf8("девятьсот")}; QString sDecs[10] = {trUtf8("") ,trUtf8("") ,trUtf8("двадцать") ,trUtf8("тридцать") ,trUtf8("сорок") ,trUtf8("пятьдесят") ,trUtf8("шестьдесят") ,trUtf8("семьдесят") ,trUtf8("восемьдесят") ,trUtf8("девяноста")}; QString sIntsW[20] = {trUtf8("") ,trUtf8("одна") ,trUtf8("две") ,trUtf8("три") ,trUtf8("четыре") ,trUtf8("пять") ,trUtf8("шесть") ,trUtf8("семь") ,trUtf8("восемь") ,trUtf8("девять") ,trUtf8("десять") ,trUtf8("одиннадцать") ,trUtf8("двенадцать") ,trUtf8("тринадцать") ,trUtf8("четырнадцать") ,trUtf8("пятнадцать") ,trUtf8("шестнадцать") ,trUtf8("семнадцать") ,trUtf8("восемнадцать") ,trUtf8("девятнадцать")}; QString sInts[20] = {trUtf8("") ,trUtf8("один") ,trUtf8("два") ,trUtf8("три") ,trUtf8("четыре") ,trUtf8("пять") ,trUtf8("шесть") ,trUtf8("семь") ,trUtf8("восемь") ,trUtf8("девять") ,trUtf8("десять") ,trUtf8("одиннадцать") ,trUtf8("двенадцать") ,trUtf8("тринадцать") ,trUtf8("четырнадцать") ,trUtf8("пятнадцать") ,trUtf8("шестнадцать") ,trUtf8("семнадцать") ,trUtf8("восемнадцать") ,trUtf8("девятнадцать")}; //Приставки QString sMilliards[6] = {trUtf8("миллиардов") ,trUtf8("миллиард") ,trUtf8("миллиарда") ,trUtf8("миллиарда") ,trUtf8("миллиарда") ,trUtf8("миллиардов")}; QString sMillions[6] = {trUtf8("миллионов") ,trUtf8("миллион") ,trUtf8("миллиона") ,trUtf8("миллиона") ,trUtf8("миллиона") ,trUtf8("миллионов")}; QString sTousands[6] = {trUtf8("тысяч") ,trUtf8("тысяча") ,trUtf8("тысячи") ,trUtf8("тысячи") ,trUtf8("тысячи") ,trUtf8("тысяч")}; QString sIndexes[6] = {trUtf8("рублей") ,trUtf8("рубль") ,trUtf8("рубля") ,trUtf8("рубля") ,trUtf8("рубля") ,trUtf8("рублей")}; if(nSumm >= 100){ nHIndex = nSumm / 100; nDIndex = nSumm - (nHIndex * 100); } else nDIndex = nSumm - (nHIndex * 100); if(nDIndex < 20){ if(nKey == 3) sSummAsText = " " + sHundreds[nHIndex] + " " + sIntsW[nDIndex]; else sSummAsText = " " + sHundreds[nHIndex] + " " + sInts[nDIndex]; } else{ nDIndex = (nSumm - (nHIndex * 100)) / 10; nIIndex = nSumm - (nHIndex * 100) - (nDIndex * 10); if(nKey == 3) sSummAsText = " " + sHundreds[nHIndex] + " " + sDecs[nDIndex] + " " + sIntsW[nIIndex]; else sSummAsText = " " + sHundreds[nHIndex] + " " + sDecs[nDIndex] + " " + sInts[nIIndex]; } //Добавляем приставку int nAddKey = 0; nDIndex = nSumm - (nHIndex * 100); if(nDIndex < 20){ if(nDIndex < 6) nAddKey = nDIndex; else nAddKey = 5; } else{ if(nIIndex < 6) nAddKey = nIIndex; else nAddKey = 5; } switch(nKey){ case 1: sSummAsText += " " + sMilliards[nAddKey]; break; case 2: sSummAsText += " " + sMillions[nAddKey]; break; case 3: sSummAsText += " " + sTousands[nAddKey]; break; case 4: sSummAsText += " " + sIndexes[nAddKey]; break; } return sSummAsText;}