Домівка > Uncategorized > Переведення числового запису в його рядковий відповідник

Переведення числового запису в його рядковий відповідник

У багатьох програмістів в житті наступає момент, коли виникає потреба в переведенні числа, наприклад прочитаного з бази даних, в рядок як воно читається. Зазвичай для формування фінансових документів. Таке завдання випало й мені. Результат програми виглядає так:
123.12 – сто двадцять три грн. 12 коп.
123832 – сто двадцять три тисячі вiсiмсот тридцять двi грн. 12 коп.
12394355.12 – дванадцять мiльйонiв триста дев’яносто чотири тисячі триста п’ятдесят п’ять грн. 12 коп.

Далі подаю код:

#include <string>
#include <sstream>
#include <iomanip>
using namespace std;

#define BILLION 1000000000
#define MILLION 1000000
#define THOUSAND 1000

string F(int sum, int level);

string hryvnia(const double& sum) {
    ostringstream kopek;
    kopek << setfill('0') << setw(2) << (sum - int(sum)) * 100;
    string res;
    if (sum > 1) {
        int billions = int(sum / BILLION);
        int millions = int(sum / MILLION) % MILLION;
        int thousands = int(sum / THOUSAND) % THOUSAND;
        int underthousand = (int)sum % THOUSAND;
        res = F(billions, 3) + "" + F(millions, 2) + "" + F(thousands, 1) + "" + F(underthousand, 0) + "грн. " + kopek.str() + " коп.";
    }
    else {
        res = "Ноль грн. " + kopek.str() + " коп.";
    };
    return res;
}

string F(int sum, int level) {
    string res = "";

    if (0 == sum)
        return res;
    int unities = sum % 10;
    int tens = int(sum / 10) % 10;
    int hundreds = int(sum / 100) % 100;

    if (1 == tens) {
        switch(unities) {
        case 1: res = "одинадцять "; break;
        case 2: res = "дванадцять "; break;
        case 3: res = "тринадцять "; break;
        case 4: res = "чотирнадцять "; break;
        case 5: res = "п'ятнадцять "; break;
        case 6: res = "шiстьнадцять "; break;
        case 7: res = "сiмнадцять "; break;
        case 8: res = "вiсiмнадцять "; break;
        case 9: res = "дев'ятнадцять "; break;
        default: res = "десять ";
        }
    }
    else {
        switch(unities) {
        case 1: res = "одна "; if (level > 1) res = "один "; break;
        case 2: res = "двi "; if (level > 1) res = "два "; break;
        case 3: res = "три "; break;
        case 4: res = "чотири "; break;
        case 5: res = "п'ять "; break;
        case 6: res = "шiсть "; break;
        case 7: res = "сiм "; break;
        case 8: res = "вiсiм "; break;
        case 9: res = "дев'ять "; break;
        default: res = "";
        }
    }

    switch(tens) {
    case 2: res = "двадцять " + res; break;
    case 3: res = "тридцять " + res; break;
    case 4: res = "сорок " + res; break;
    case 5: res = "п'ятдесят " + res; break;
    case 6: res = "шiстдесят " + res; break;
    case 7: res = "сiмдесят " + res; break;
    case 8: res = "вiсiмдесят " + res; break;
    case 9: res = "дев'яносто " + res;
    }

    switch (hundreds) {
    case 1: res = "сто " + res; break;
    case 2: res = "двiстi " + res; break;
    case 3: res = "триста " + res; break;
    case 4: res = "чотириста " + res; break;
    case 5: res = "п'ятсот " + res; break;
    case 6: res = "шiстсот " + res; break;
    case 7: res = "сiмсот " + res; break;
    case 8: res = "вiсiмсот " + res; break;
    case 9: res = "дев'ятсот " + res;
    }

// утворення найменувань по групах тисяча-мільярд
    if (tens == 1)
        switch (level) {
        case 0: res = res; break;
        case 1: res = res + "тисяч "; break;
        case 2: res = res + "мiльйонiв "; break;
        case 3: res = res + "мiльярдiв ";
        }
    else {
        switch (unities) {
        case 1:
            switch (level) {
            case 0: res = res; break;
            case 1: res = res + "тисяча "; break;
            case 2: res = res + "мiльйон "; break;
            case 3: res = res + "мiльярд ";
            } break;
           case 2:
           case 3:
           case 4:
               switch (level) {
               case 0: res = res; break;
               case 1: res = res + "тисячі "; break;
               case 2: res = res + "мiльйона "; break;
               case 3: res = res + "мiльярда ";
               } break;
        default:
            switch (level) {
            case 0: res = res; break;
            case 1: res = res + "тисяч "; break;
            case 2: res = res + "мiльйонiв "; break;
            case 3: res = res + "мiльярдiв ";
            }
        }
    }
     return res;
}
Advertisements
Категорії:Uncategorized Позначки:,
  1. Коментарів ще немає.
  1. No trackbacks yet.

Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: