Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   [С++] перевод числа в пропись (https://forum.antichat.xyz/showthread.php?t=142856)

cupper 21.09.2009 20:51

[С++] перевод числа в пропись
 
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();
}



Время: 15:11