Название: цифры -> текст
Отправлено: Krow от Август 30, 2008, 12:51
Не знаю в какой форум отпостить тему. Поэтому создал здесь.. как можно перегнать цифры в текст например: 10 - десять? есть ли соответствующая процедура или придётся самому писать, или кто то уже сделал это раньше?
Название: Re: цифры -> текст
Отправлено: Mikhail от Август 30, 2008, 14:11
Скорее всего придется самому писать. Уж очень экзотичная потребность.
Название: Re: цифры -> текст
Отправлено: Hellraiser от Август 30, 2008, 15:57
Может помочь вот это: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=805
Название: Re: цифры -> текст
Отправлено: SASA от Август 31, 2008, 16:45
Krow, если напишешь, поделись. Функция полезная. http://www.bash.org.ru/quote/398595: Обажаю юмор программистов. Сегодня тестировал скрипт формирования договора - если указываешь сумму больше триллиона то прописью он выдает "невзъебенная сумма".
Название: Re: цифры -> текст
Отправлено: Krow от Сентябрь 10, 2008, 15:44
открыл сылку на делфи, там за старостью архива и реконструкцией ресурса сорцы удалены, Буду рыть инет дальше, кака что то накопаю, отпишусь.
Название: Re: цифры -> текст
Отправлено: Hellraiser от Сентябрь 10, 2008, 17:40
открыл сылку на делфи, там за старостью архива и реконструкцией ресурса сорцы удалены, Буду рыть инет дальше, кака что то накопаю, отпишусь.
Ссылка рабочая, сам для проверки только что скачал. Но выложить не могу, почему-то нет возможности вложения файлов (нет в IE7 и Firefox). Если админы починят - скину.
Название: Re: цифры -> текст
Отправлено: Krow от Сентябрь 21, 2008, 15:17
открыл сылку на делфи, там за старостью архива и реконструкцией ресурса сорцы удалены, Буду рыть инет дальше, кака что то накопаю, отпишусь.
Ссылка рабочая, сам для проверки только что скачал. Но выложить не могу, почему-то нет возможности вложения файлов (нет в IE7 и Firefox). Если админы починят - скину. щас скачалось..
Название: Re: цифры -> текст
Отправлено: Krow от Ноябрь 02, 2008, 14:29
Сделал на скорую руку как время появилось. если кому надо пользуйтесь.. http://original-auto.ru/nuToStr.cpp текст в юникоде и тока для русских денег ) украинские делайте сами :) предложения и замечания на krow@original-auto.ru
Название: Re: цифры -> текст
Отправлено: pastor от Ноябрь 02, 2008, 14:57
Когда-то (года 4 назад), написал функцию преобраования "цифры -> текст". Можите взглянуть на неё: 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; } ЗЫ: Писалось под Украину, на библиотеке Qt3 for PlamOS, поэтому будут необходимы незначительные изменения в коде.
Название: Re: цифры -> текст
Отправлено: Krow от Ноябрь 02, 2008, 16:02
где ж ты был раньше..? :) когда нужно было.
Название: Re: цифры -> текст
Отправлено: -QT- от Март 26, 2009, 14:50
Мои пять копеек. Доработано для QT4, ну и так по мелочи 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; }
Название: Re: цифры -> текст
Отправлено: BaHeK от Январь 28, 2011, 12:37
Добрый день! Вчера понадобилось написать преобразование числа в строку. Работает с целыми числами (Поскольку в Беларуси нету копеек). Видел что выше уже написаный код, но всетки пускай поваляется... 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; }
|