Russian Qt Forum
Март 29, 2024, 13:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: цифры -> текст  (Прочитано 14944 раз)
Krow
Гость
« : Август 30, 2008, 12:51 »

Не знаю в какой форум отпостить тему. Поэтому создал здесь..
как можно перегнать цифры в текст например: 10 - десять? есть ли соответствующая процедура или придётся самому писать, или кто то уже сделал это раньше?
Записан
Mikhail
Программист
*****
Online Online

Сообщений: 586


Просмотр профиля
« Ответ #1 : Август 30, 2008, 14:11 »

Скорее всего придется самому писать. Уж очень экзотичная потребность.
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #2 : Август 30, 2008, 15:57 »

Может помочь вот это: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=805
Записан
SASA
Гость
« Ответ #3 : Август 31, 2008, 16:45 »

Krow, если напишешь, поделись. Функция полезная.

http://www.bash.org.ru/quote/398595:
Цитировать
Обажаю юмор программистов. Сегодня тестировал скрипт формирования договора - если указываешь сумму больше триллиона то прописью он выдает "невзъебенная сумма".
Записан
Krow
Гость
« Ответ #4 : Сентябрь 10, 2008, 15:44 »

открыл сылку на делфи, там за старостью архива и реконструкцией ресурса сорцы удалены, Буду рыть инет дальше, кака что то накопаю, отпишусь.
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #5 : Сентябрь 10, 2008, 17:40 »

открыл сылку на делфи, там за старостью архива и реконструкцией ресурса сорцы удалены, Буду рыть инет дальше, кака что то накопаю, отпишусь.
Ссылка рабочая, сам для проверки только что скачал. Но выложить не могу, почему-то нет возможности вложения файлов (нет в IE7 и Firefox). Если админы починят - скину.
Записан
Krow
Гость
« Ответ #6 : Сентябрь 21, 2008, 15:17 »

открыл сылку на делфи, там за старостью архива и реконструкцией ресурса сорцы удалены, Буду рыть инет дальше, кака что то накопаю, отпишусь.
Ссылка рабочая, сам для проверки только что скачал. Но выложить не могу, почему-то нет возможности вложения файлов (нет в IE7 и Firefox). Если админы починят - скину.
щас скачалось..
Записан
Krow
Гость
« Ответ #7 : Ноябрь 02, 2008, 14:29 »

Сделал на скорую руку как время появилось. если кому надо пользуйтесь..
http://original-auto.ru/nuToStr.cpp
текст в юникоде и тока для русских денег ) украинские делайте сами Улыбающийся
предложения и замечания на
krow@original-auto.ru
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #8 : Ноябрь 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, поэтому будут необходимы незначительные изменения в коде.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Krow
Гость
« Ответ #9 : Ноябрь 02, 2008, 16:02 »

где ж ты был раньше..? Улыбающийся когда нужно было.
Записан
-QT-
Гость
« Ответ #10 : Март 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;
}
Записан
BaHeK
Гость
« Ответ #11 : Январь 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;
}
« Последнее редактирование: Январь 28, 2011, 12:40 от joy » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.105 секунд. Запросов: 22.