ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
 
 
Опции темы Поиск в этой теме Опции просмотра

[С++] перевод числа в пропись
  #1  
Старый 21.09.2009, 20:51
cupper
Постоянный
Регистрация: 06.06.2007
Сообщений: 575
Провел на форуме:
1180737

Репутация: 180


По умолчанию [С++] перевод числа в пропись

Lелал программку, одной из ее особенностей являлось необходимость вывода числа прописью (в моем случае это сумма в рублях до 999999999.99)(
137098.37 = сто тридцать семь тсячь девяносто восемь рублей тридцать семь копеек). С горем пополам реализовал эту функциональность, на мой взгляд очень интересная фича, вот выкладываю код, может кому будет интересно или пригодится.

Сразу предупреждаю - код убогий, зато работает.
Код:
string _rub (const int num){
       if ((num >= 5 && num <= 19) || num%10 == 0) return "рублей";
       else if (num >= 2 && num <= 4) return "рубля";
       else return "рубль";
       return "error";
}
string _cop (const int num){
       if ((num >= 5 && num <= 19) || num%10 == 0) return "копеек";
       else if (num >= 2 && num <= 4) return "копейки";
       else return "копейка";
       return "error";
}
string _thousands (const int num){
       if ((num >= 5 && num <= 19) || num%10 == 0) return "тысяч";
       else if (num >= 2 && num <= 4) return "тысячи";
       else return "тысяча";
       return "error";
}
string _millions (const int num){
       if ((num >= 5 && num <= 19) || num%10 == 0) return "миллионов";
       else if (num >= 2 && num <= 4) return "миллиона";
       else return "миллион";
       return "error";
}
map<int,string> digit1_19;
string propis99 (const int num, const bool key = 0){
       if (num == 0) return "";
       string temp;
       if (key == 1){
          digit1_19[1]="одина"; // одна копейка
          digit1_19[2]="две"; // две тысячи
       }
       if (num > 0 && num < 20){
          temp=digit1_19[num];
          if (key == 1){
             digit1_19[1]="один"; // один рубль 
             digit1_19[2]="два"; // два миллиона
          }
          return temp.c_str();
       }
       else{
            if (num >= 20 && num <=39){
               return (digit1_19[(num-num%10)/10]+"дцать "+digit1_19[num%10]).c_str();
            }
            else if (num >= 40 && num <=49){
                    return ("сорок "+digit1_19[num%10]).c_str();
                 }
            else if (num >= 50 && num <=89){
                    return (digit1_19[(num-num%10)/10]+"десят "+digit1_19[num%10]).c_str();
                 }
            else{
                 return ("девяносто "+digit1_19[num%10]).c_str();
            }
            return "FAIL";
       }
}
string propis999 (const int num, const bool key = 0){
       //if (num == 0) return "";
       if (num > 0 && num <100)
          return propis99(num, key);
       else if (num < 200){
               return ("сто "+propis99(num%100, key));
            }
       else if (num < 300){
               return ("двести "+propis99(num%100, key));
            }
       else if (num >=300 && num <500){
               return (digit1_19[(num-num%100)/100]+"ста "+ propis99(num%100, key));
            }
       else{
            return (digit1_19[(num-num%100)/100]+"сот "+ propis99(num%100, key));
       }
       
}
const char* convert_to_str(const double num){
      //--------------------------------------
digit1_19[1]="один";
digit1_19[2]="два";
digit1_19[3]="три";
digit1_19[4]="четыре";
digit1_19[5]="пять";
digit1_19[6]="шесть";
digit1_19[7]="семь";
digit1_19[8]="восемь";
digit1_19[9]="девять";
digit1_19[10]="десять";
digit1_19[11]="одиннадцать";
digit1_19[12]="двенадцать";
digit1_19[13]="тринадцать";
digit1_19[14]="четырнадцать";
digit1_19[15]="пятнадцать";
digit1_19[16]="шестнадцать";
digit1_19[17]="семьнадцать";
digit1_19[18]="восемьнадцать";
digit1_19[19]="девятнадцать";
       //--------------------------------------
       if (num > 999999999.99) return "превышена максимальная сумма в 999,999,999.99 рублей";
       string str, str1;
       const int RUB = (int)num;
       const int COP = (int)((num - RUB)*100);
       int tempr1=RUB, tempr2; // в tempr2 храниться посление одно-два-три числа от оставшегося числа
       int keyH=0; // если выше 0 то значит пора делать приписки 1 - тысячи, 2 - миллионы
       if (RUB == 0){str+="ноль ";}
       else{
            while (tempr1 > 0){
                  /*вычленяем по три-две-одной цифре и распознаем их, до тех пор пока цивры некончаться*/
                  tempr2=tempr1%1000;
                  if (tempr2 != 0){
                  if (tempr2%10 == 1 || tempr2%10 == 2) str1=propis999(tempr2, 1)+" ";
                  else str1=propis999(tempr2)+" ";
                  if (keyH == 1){
                     if (tempr2%100 > 10 && tempr2%100 < 20)str1+=_thousands(tempr2%100)+" ";
                     str1+=_thousands(tempr2%10)+" ";
                  }
                  if (keyH == 2){
                      if (tempr2%100 > 10 && tempr2%100 < 20)str1+=_millions(tempr2%100)+" ";
                     str1+=_millions(tempr2%10)+" ";
                  }
                  str1+=str;
                  str=str1;
                  }
                  tempr1=(tempr1-tempr2)/1000;
                  ++keyH;
            }
       }
       if (RUB%100 > 10 && RUB%100 < 20) str+=_rub(11)+" ";
       else str+=_rub(RUB%10)+" ";
       if (COP == 0){str+="ноль ";}
       else if (COP%10 == 1 || COP%10 == 2) str+=propis999(COP, 1)+" ";
       else str+=propis999(COP)+" ";
       if (COP%100 > 10 && COP%100 < 20) str+=_cop(11);
       else str+=_cop(COP%10);
       return str.c_str();
}
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почтовый перевод вебмани jenyavlg Болталка 10 30.06.2009 16:50
Перевод официальной документации w3af Kuzya Статьи 7 05.06.2009 16:54
В интернете зафиксирован рост числа заражений вирусом Sality.AO jerrri Мировые новости 9 20.02.2009 09:55
Assembler FAQ GlobalRave С/С++, C#, Delphi, .NET, Asm 2 15.02.2009 18:59
НЕМЕЦКИЙ. Перевод. Консультации. NORDGER О Работе 0 23.11.2006 03:15



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ