Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2013, 22:08   #1
SashOkSerg
mother russia
Пользователь
 
Аватар для SashOkSerg
 
Регистрация: 09.11.2012
Сообщений: 25
По умолчанию Перевод числа в пропись

Столкнулся с такой проблемой... я разработал программу которая печатает товарно-транспортную накладную (ТТН)... но в один прекрасный момент мне сказали что бланк ТТН изменился и теперь надо чтобы тоннаж кроме цифр также выводился и прописью... На одном из форумов я нашел рабочий код который переводит числа в рубли... я смог чуть его подправить и теперь он выводит это:



Но есть нюанс как видно на картинке он вместо двести килограмм вывел двадцать, + в поле я не могу ввести число 34,2 приходиться вводит через ctrl+v

код программы ниже:

PHP код:
#include <vcl.h>
#pragma hdrstop
#include <math.h>
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
System::WideChar DecimalSeparator;
AnsiString edk(int bvk)
{
AnsiString res="";//возвращаемое значение
int qr;//частное и остаток
q=div(bvk10).quot;
r=div(bvk10).rem;
if (
q!=1)
{
 switch (
r)
  {
   case 
1res="одна"; break;
   case 
2res="две"; break;
   case 
3res="три"; break;
   case 
4res="четыре"; break;
   case 
5res="пять"; break;
   case 
6res="шесть"; break;
   case 
7res="семь"; break;
   case 
8res="восемь"; break;
   case 
9res="девять"; break;
  }
}
else
 
res="";
return (
res);
}
//----------------
AnsiString des (int inp)
{
AnsiString res="";//возвращаемое значение
int qr;//частное и остаток
q=div(inp10).quot;
r=div(inp10).rem;
if (
q==0) return ("");
switch (
q)
 {
  case 
1:
  switch (
r)
   {
    case 
0res="десять"; break;
    case 
1res="одиннадцать"; break;
    case 
2res="двенадцать"; break;
    case 
3res="тринадцать"; break;
    case 
4res="четырнадцать"; break;
    case 
5res="пятнадцать"; break;
    case 
6res="шестнадцать"; break;
    case 
7res="семнадцать"; break;
    case 
8res="восемнадцать"; break;
    case 
9res="девятнадцать"; break;
   }
  break;
  case 
2res="двадцать"; break;
  case 
3res="тридцать"; break;
  case 
4res="сорок"; break;
  case 
5res="пятьдесят"; break;
  case 
6res="шестьдесят"; break;
  case 
7res="семьдесят"; break;
  case 
8res="восемдесят"; break;
  case 
9res="девяносто"; break;
 }
return (
res);
}
//-----------------
AnsiString kop (int bvk)
{
AnsiString res=des(bvk)+" "+edk(bvk);
if (
res==" ")
 return(
"ноль кг.");
else
 return (
res+" кг.");
}
//-------------------
AnsiString edr(int bvr)
{
AnsiString res="";//возвращаемое значение
int qr;//частное и остаток
q=div(bvr10).quot;
r=div(bvr10).rem;
if (
q!=1)
{
 switch (
r)
  {
   case 
1res="один"; break;
   case 
2res="два"; break;
   case 
3res="три"; break;
   case 
4res="четыре"; break;
   case 
5res="пять"; break;
   case 
6res="шесть"; break;
   case 
7res="семь"; break;
   case 
8res="восемь"; break;
   case 
9res="девять"; break;
  }
}
else
 
res="";
return (
res);
}
//--------------------
AnsiString sot (int bvr)
{
AnsiString res="";
int q=div(bvr100).quot;
if (
q!=0)
 {
  switch (
q)
   {
    case 
1res="сто"; break;
    case 
2res="двести"; break;
    case 
3res="триста"; break;
    case 
4res="четыреста"; break;
    case 
5res="пятьсот"; break;
    case 
6res="шестьсот"; break;
    case 
7res="семьсот"; break;
    case 
8res="восемьсот"; break;
    case 
9res="девятьсот"; break;
   }
  return (
res+" ");
 }
else
 return (
"");
}
//---------------------
AnsiString tis (int bvr)
{
AnsiString res=sot((bvr%1000000)/1000)+des((bvr%100000)/1000)+" "+edk((bvr%100000)/1000);
if (
res==" ")
 return(
"");
else
 return (
res+" тыс.");
}
//----------------------
AnsiString rub (int bvr)
{
AnsiString res=tis(bvr)+" "+sot(bvr%1000)+des(bvr%100)+" "+edr(bvr%100);
if (
res==" ")
 return(
"ноль кг.");
else
 return (
res+" тон.");
}
//----------------------
__fastcall TForm1::TForm1(TComponentOwner)
    : 
TForm(Owner)
{
}
//--------------------
int myround (double h)
{
if (
h>=(int(h)+0.5))
 
h=ceil(h);
else
 
h=floor(h);
return (
h);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString rk;
r=k=0;
double bv=(Edit1->Text).ToDouble();//исходное число
int bvrbvk;//рубли и копейки
bvr=bvk=0;
bvr=int(bv);
double h=0;
h=(bv-int(bv))*100;
bvk=myround(h);
k="";
r=rub(bvr);//рубли
k=kop(bvk);//копейки
Edit2->Text=r+" "+k;
k="";
}
//-----------------------
void __fastcall TForm1::Edit1KeyPress(TObject *SenderSystem::WideChar &Key)
{
if ((
Key>='0') && (Key<='9'))
 return;
if (
Key == DecimalSeparator)
 {
  if ((
Edit1->Text).Pos(DecimalSeparator)!=0)
   
Key=0;
  return;
 }
if (
Key==VK_BACK)
 return;
if (
Key==VK_RETURN)
 {
  
Button1->SetFocus();
  return;
 }
Key=0;
}
//------------- 
На форме расположены Edit1, Edit2, Button1
Мне все равно что вы обо мне думаете, я о вас не думаю вообще.
SashOkSerg вне форума Ответить с цитированием
Старый 18.07.2013, 23:31   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, очень похоже, что Вы взяли готовый и рабочий код, который переводил дробное число в рубли и копейки, бездумно заменили рубли на тонны, копейки на килограммы, совершенно не подумав о том, что в рубле 100 копеек (поэтому 34.2 это 34 рубля и ДВАДЦАТЬ копеек), а в тонне 1000 кг ( поэтому 34.2 это 34 тонны и ДВЕСТИ килограмм)

исправьте так:
Код:
h=(bv-int(bv))*1000; 
bvk=myround(h);

дисклеймер. я пишу прямо в браузере, код, разумеется, не проверял...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.07.2013, 13:06   #3
SashOkSerg
mother russia
Пользователь
 
Аватар для SashOkSerg
 
Регистрация: 09.11.2012
Сообщений: 25
По умолчанию

исправил, но программа теперь не видит число после запятой!
Мне все равно что вы обо мне думаете, я о вас не думаю вообще.
SashOkSerg вне форума Ответить с цитированием
Старый 19.07.2013, 17:15   #4
SashOkSerg
mother russia
Пользователь
 
Аватар для SashOkSerg
 
Регистрация: 09.11.2012
Сообщений: 25
По умолчанию

В функции kop изменил ряд:
PHP код:
AnsiString res=des(bvk)+" "+edk(bvk); 
на
PHP код:
AnsiString res=sot(bvk)+des(bvk%100)+" "+edk(bvk); 
и заработало... + нашел выход из ситуации почему не мог ввести запятую:

в свойствах Edit1 OnKeyPress дописал условие
PHP код:
(Key>='0') && (Key<='9') || (Key == ','
и сразу заработала запятая!

Спасибо за помощь!
Мне все равно что вы обо мне думаете, я о вас не думаю вообще.
SashOkSerg вне форума Ответить с цитированием
Старый 05.05.2016, 12:06   #5
SashOkSerg
mother russia
Пользователь
 
Аватар для SashOkSerg
 
Регистрация: 09.11.2012
Сообщений: 25
По умолчанию

Приходится, к сожалению, снова поднять эту неприятную тему. Столкнулся с такой проблемой - необходимо чтобы программа умела переводить в пропись числа такого формата (0,97 т. т.е. ноль т. дев'ятсот семьдесят кг.) На данный момент код переводит числа в пропись все что выше 1 т. и только десятую часть, а необходимо чтобы она переводила и сотую часть. Помогите пожалуйста доделать код чтобы программа переводила числа которые меньше "1 т." и сотую часть числа.

Исходник
Мне все равно что вы обо мне думаете, я о вас не думаю вообще.

Последний раз редактировалось SashOkSerg; 05.05.2016 в 12:26.
SashOkSerg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пропись числа на другом языке Mint86 Microsoft Office Excel 15 29.03.2012 13:15
Перевод числа. bignick Паскаль, Turbo Pascal, PascalABC.NET 5 30.09.2010 12:20
Пропись триггера в Delphi shishechka Помощь студентам 2 04.02.2010 13:42
Число в пропись Shavminator Microsoft Office Excel 6 07.01.2008 10:32
перевод числа kommunist Помощь студентам 5 15.10.2007 22:58