PDA

Просмотр полной версии : [С++] перевод числа в пропись


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();
}