Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / числа буквами / 12 сообщений из 12, страница 1 из 1
18.12.2006, 11:54
    #34206836
ddelete
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
числа буквами
Задачас которой сталкивался не раз..но все время находил отговорки, чтоб ее нерешать :)
а теперь вот приперло так что решить надо полюбому...
Задача:
Записать число словами.
Пример:
Дано 23
Надо двадцать три
Дано -25.5
Надо минус двадцать пять (рублей) пять (копеек)

Кто нибудь может помочь....в идеале на Perle, но а вообще на любом языке..главно идею....
...
Рейтинг: 0 / 0
18.12.2006, 12:24
    #34206959
Aklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
числа буквами
берешь остаток от деления на 10. пишешь (в ум) "стольоко-то" (перебор - вручную, т.е. 1 - "один", 2- "два"... )
если первый минус, то еще пишешь "минус".
теперь все из ума в обратном порядке.

примерно то же для дробей. (

АЛГОРИТМ ТРИВИАЛЬНЫЙ И ХОТЬ СКОЛЬКО НИБУДЬ НЕ ЛЕНИВЫЙ ЧЕЛОВЕК, НАПИСАВШИЙ ХОТЬ НЕМНОГО САМ ЕГО ЗНАЕТ.

примечание. ИСХОДНИКОВ ДАННОГО АЛГОРИТМА ДОФЕГА.
"вы невнимательны, воспользуйтесь поиском" (с)

опять же google рулит.

примечание 2.
смотреть **10 - **19 отдельно (т.е. писать "сто одинадцать" а не "сто десять один" )

исходик - в раздел работа. хотя и десь вы модете предложить свою цену.
аффтопитезь
...
Рейтинг: 0 / 0
18.12.2006, 12:25
    #34206962
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
числа буквами
начни с того, что найди старший разряд, а дальше легко.
...
Рейтинг: 0 / 0
18.12.2006, 13:13
    #34207184
акуз-лингвист
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
числа буквами
блондинка в банке (на предложение написать сумму прописью):
- молодой человек, вы в своём уме? как я напишу цифры буквами???
...
Рейтинг: 0 / 0
18.12.2006, 15:19
    #34207673
SnowMan2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
числа буквами
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
void ToLine(char *Buf, double summa)
{
 int i, j, k, p, p_old, big= 0 , ISumma;
 char *razr_1b[]={"","Один","Два","Три","Четыре","Пять","Шесть","Семь","Восемь","Девять"};
 char *razr_2b[]={"","","Двадцать","Тридцать","Сорок","Пятьдесят","Шестьдесят","Семьдесят","Восемьдесят","Девяносто"};
 char *razr_3b[]={"","Сто","Двести","Триста","Четыреста","Пятьсот","Шестьсот","Семьсот","Восемьсот","Девятьсот"};
 char *razr_4b[]={"Десять","Одиннадцать","Двенадцать","Тринадцать","Четырнадцать","Пятнадцать",
                "Шестнадцать","Семнадцать","Восемнадцать","Девятнадцать"};

 char *razr_1l[]={"","один","два","три","четыре","пять","шесть","семь","восемь","девять"};
 char *razr_2l[]={"","","двадцать","тридцать","сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят","девяносто"};
 char *razr_3l[]={"","сто","двести","триста","четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот"};
 char *razr_4l[]={"десять","одиннадцать","двенадцать","тринадцать","четырнадцать","пятнадцать",
                "шестнадцать","семнадцать","восемнадцать","девятнадцать"};

 char *dop2_b="Две", *dop2_l="две";
 char *dop1_b="Одна", *dop1_l="одна";

 char *word[]={"миллиард","миллион","тысяч","руб."};
 char Buf2[ 1000 ];

 k= 0 ;
 p= 0 ; p_old= 0 ;
 Buf[ 0 ]= 0 ;
 if (summa <  0 ) AddStr(Buf, "минус ");
 for (i= 11 ; i>= 0 ; i--) {
     if (i== 8  && k== 1 ) {
          k= 0 ;
		AddStr(Buf, word[ 0 ]);
		if (p_old== 1 ) {
               AddStr(Buf, "ов ");
          } else {
     	     if(p== 1 )                 AddStr(Buf, " ");
	     	if(p== 2  || p== 3  || p== 4 ) AddStr(Buf, "а ");
		     if(p== 0 )                 AddStr(Buf, "ов ");
			if(p>= 5  && p<= 9 )         AddStr(Buf, "ов ");
          } // else
     } // if (i== 8  && k== 1 )

     if (i== 5  && k== 1 ) {
          k= 0 ;
		AddStr(Buf, word[ 1 ]);
          if (p_old== 1 ) {
               AddStr(Buf, "ов ");
          } else {        
		     if(p== 1 )                 AddStr(Buf, " ");
		     if(p== 2  || p== 3  || p== 4 ) AddStr(Buf, "а ");
               if(p== 0 )                 AddStr(Buf, "ов ");
               if(p>= 5  && p<= 9 )         AddStr(Buf, "ов ");
          } // else
     } // if (i== 5  && k== 1 )

     if (i== 2  && k== 1 ) {
          k= 0 ;
          AddStr(Buf, word[ 2 ]);
		if(p_old== 1 ) {
               AddStr(Buf, " "); 
          } else {
               if(p== 1 )                 AddStr(Buf, "а ");
               if(p== 2  || p== 3  || p== 4 ) AddStr(Buf, "и ");
			if(p== 0 )                 AddStr(Buf, " ");
			if(p>= 5  && p<= 9 )         AddStr(Buf, " ");
          } // else
     } // (i== 2  && k== 1 )

     p_old=p;
	p=(int)floor(summa / pow( 10 ., (double)i));
     if (p== 0 ) continue;
     k= 1 ;

     if( i== 11  || i== 8  || i== 5  || i== 2 ) {
		if (big== 0 ) {AddStr(Buf, razr_3b[p]); AddStr(Buf, " ");}
		else        {AddStr(Buf, razr_3l[p]); AddStr(Buf, " ");}
     } // if

     if (i== 10  || i== 7  || i== 4  || i== 1 ) {
          if(p !=  1 ) {
               if(big== 0 )  {AddStr(Buf, razr_2b[p]); AddStr(Buf, " ");}
			else        {AddStr(Buf, razr_2l[p]); AddStr(Buf, " ");}
          } else {
               summa = summa - p * pow( 10 ., (double)i);
               i--;
               p_old=p;
               p=(int)floor(summa / pow( 10 ., (double)i));

			if(big== 0 ) {AddStr(Buf, razr_4b[p]); AddStr(Buf, " "); }
			else       {AddStr(Buf, razr_4l[p]); AddStr(Buf, " "); }

			summa = summa - p * pow( 10 ., (double)i);
               big= 1 ;
               continue;
          } // else
     } // if (i== 10  || i== 7  || i== 4  || i== 1 )

     if (i== 9  || i== 6  || i== 3  || i== 0 ) {
          if (big== 0 ) {
		     if( (i== 3  && p== 1 ) || (i== 3  && p== 2 )) {
			     if(p== 1 )  {AddStr(Buf, dop1_b); AddStr(Buf, " "); }
				if(p== 2 )  {AddStr(Buf, dop2_b); AddStr(Buf, " "); }
               } else {
                    AddStr(Buf, razr_1b[p]); AddStr(Buf, " ");
               } // else
          } else {
			if ((i== 3  && p== 1 ) || (i== 3  && p== 2 )) {
				if(p== 1 )  {AddStr(Buf, dop1_l); AddStr(Buf, " "); }
				if(p== 2 )  {AddStr(Buf, dop2_l); AddStr(Buf, " "); }
               } else  {
                    AddStr(Buf, razr_1l[p]); AddStr(Buf, " ");
               } // else
          } // else
     }

     summa = summa - p * pow( 10 ., (double)i);
     big= 1 ;
 } // for

 AddStr(Buf, word[ 3 ]);
 ISumma =  100  * (summa+ 0 . 005 );
 AddStr(Buf, " ");
 sprintf(Buf2, "%02d", ISumma);
 AddStr(Buf, Buf2);
 AddStr(Buf, " коп.");
} // ToLine

//---------------------------------------------------------------------------

static void AddStr(char *Buf, char *s)
{
 strcat(Buf, s);
} // AddStr
...
Рейтинг: 0 / 0
18.12.2006, 15:23
    #34207686
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
числа буквами
на языке павербилдера и с украинской версией
http://users.iptelecom.net.ua/~agp1/software/num2word.tar.gz
...
Рейтинг: 0 / 0
18.12.2006, 15:55
    #34207834
muk07
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
числа буквами
Для забавы ещё вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
//==============================
// ЧИСЛО ПРОПИСЬЮ
static char *Twenty[]={
"","один ","два ","три ","четыре ","пять ","шесть ","семь ","восемь ",
"девять ","десять ","одиннадцать ","двенадцать ","тринадцать ",
"четырнадцать ","пятнадцать ","шестнадцать ","семнадцать ",
"восемнадцать ","девятнадцать "};

static char *Dec[]={
"", "одна","две","три","четыре","пять","шесть","семь","восемь",
"девять"};

static char *Decades[]={
"","","двадцать ","тридцать ","сорок ","пятьдесят ","шестьдесят ",
"семьдесят ","восемьдесят ","девяносто "};

static char *Hundreds[]={
"","сто ","двести ","триста ","четыреста ","пятьсот ","шестьсот ",
"семьсот ","восемьсот ","девятьсот "};

typedef struct {
	char *im;
	char *rod;
	char *mult;
}TRIADA;
static TRIADA tri[]={
	{"","",""},
	{"тысяча ","тысячи ","тысяч "},
	{"миллион ","миллиона ","миллионов "},
	{"миллиард ","миллиарда ", "миллиардов "},
};
static char Low[]= "йцукенгшщзхъфывапролджэячсмитьбю";
static char High[]="ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ";

#define MAXDIG  20 
#define MAXTRIAD  4 

void NumTxt(char *s, double n, int cel){
// Число n прописью в s
// cel== 1  - c десятыми
char dig[MAXDIG],*dot,*d;
char t[ 3 ]; // триада
int l,i,k,nint,ntriad,empty;
char buf[ 100 ];
char *dd;
long ll,lm;
char *ts;

memset(dig, 0 ,MAXDIG*sizeof(char));
// выделить все цифры
sprintf(dig,"%lf", n+ 0 . 01 );
// позиция точки
dot=strchr(dig,'.');
// правее десятых обрезать
dot[ 2 ]='\0';
// преобразуем все к цифрам
for(d=dig; *d!='\0'; d++){
	*d-='0';
}
*dot='\0';

nint=(int)(dot-dig); // цифр в целой части
ntriad=nint/ 3 +(nint% 3 != 0 );
*s='\0';

for(i= 0 ;i<ntriad;i++){ // i -номер триады
	k=nint- 3 *(i+ 1 );
	l= 0 ;
	if(k< 0 ){ // k - позиция в dig,откуда взять триаду
		l=-k;
		k= 0 ;
	}
	memset(t, 0 , 3 *sizeof(char));
	memcpy(t+l,dig+k, ( 3 -l)*sizeof(char));
	// в t - триада
	*buf='\0';
	strcpy(buf, Hundreds[t[ 0 ]]);
	k= 10 *t[ 1 ]+t[ 2 ];
	if(k< 20  && k> 2 ){
		strcat(buf,Twenty[k]);
		goto mm;
	}
	if(k>= 20 ){
		strcat(buf,Decades[t[ 1 ]]);
	}
	if(t[ 2 ]== 1 ){ //@@
		if(i== 1  || (i== 0  && cel && ((long)( 10 *n+ 0 . 01 ))% 10 > 0 )){ // тысячи
        // либо целые с непустой дробной частью
			strcat(buf,"одна ");
		} else {
			strcat(buf,"один ");
		}
		goto mm;
	}
	if(t[ 2 ]== 2 ){ //@@
		if(i== 1  || (i== 0  && cel && ((long)( 10 *n))% 10 > 0 )){ // тысячи
			strcat(buf,"две ");
		} else {
			strcat(buf,"два ");
		}
		goto mm;
	}
	strcat(buf,Twenty[t[ 2 ]]);
mm:
	empty= 1 ;
	for(k= 0 ; k<(int)strlen(buf); k++){
		if(buf[k]!=' '){
			empty= 0 ;
			break;
		}
	}
	if(empty){
		goto next;
	}
	k= 10 *t[ 1 ]+t[ 2 ];
	if(k> 9  && k< 20 ){
		strcat(buf,tri[i].mult);
		goto next;
	}
	switch(t[ 2 ]){
		case  1 :
			strcat(buf, tri[i].im);
			break;
		case  2 :
		case  3 :
		case  4 :
			strcat(buf, tri[i].rod);
			break;
		default:
			strcat(buf,tri[i].mult);
			break;
	}
	next:
	LeftStrCat(s,buf);
}
// Первая буква - заглавная
for(k= 0 ;k<(int)strlen(Low);k++){
	if(Low[k]==*s){
		*s=High[k];
		break;
	}
}
strcat(s,d);
//fin:
// приделать десятые
k=dot[ 1 ];
if(k> 0  && cel){
	if(k== 1 ){
		dd="десятая";
	} else {
		dd="десятых";
	}
	ll=((long)n)% 10 ; // последняя цифра целой части
	lm=((long)n)% 100 ; // две предпоследних цифры
	if(ll== 1  && lm!= 11 ){
		ts="целая";
	} else {
		ts="целых";
	}
	sprintf(s+strlen(s)," %s %s %s",ts,Dec[k], dd);
}
trim(s);
return;
}

...
Рейтинг: 0 / 0
18.12.2006, 16:22
    #34207951
ddelete
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
числа буквами
спасиб :) всем....
я вот и свой вариант сделал..если кому нужно в перле...пишите..
...
Рейтинг: 0 / 0
18.12.2006, 17:49
    #34208405
Den_di
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
числа буквами
Aklinберешь остаток от деления на 10. пишешь (в ум) "стольоко-то" (перебор - вручную, т.е. 1 - "один", 2- "два"... )
если первый минус, то еще пишешь "минус".
теперь все из ума в обратном порядке.

примерно то же для дробей. (

АЛГОРИТМ ТРИВИАЛЬНЫЙ И ХОТЬ СКОЛЬКО НИБУДЬ НЕ ЛЕНИВЫЙ ЧЕЛОВЕК, НАПИСАВШИЙ ХОТЬ НЕМНОГО САМ ЕГО ЗНАЕТ.

примечание. ИСХОДНИКОВ ДАННОГО АЛГОРИТМА ДОФЕГА.
"вы невнимательны, воспользуйтесь поиском" (с)

опять же google рулит.

примечание 2.
смотреть **10 - **19 отдельно (т.е. писать "сто одинадцать" а не "сто десять один" )

исходик - в раздел работа. хотя и десь вы модете предложить свою цену.
аффтопитезь

Скряга (!)
...
Рейтинг: 0 / 0
18.12.2006, 20:19
    #34208775
1010100
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
числа буквами
на дельфи
...
Рейтинг: 0 / 0
18.12.2006, 20:20
    #34208776
1010100
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
числа буквами
без копеек
...
Рейтинг: 0 / 0
19.12.2006, 12:42
    #34210138
ddelete
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
числа буквами
спасибо!
вот нашел еще способ
прям в Oracle (правда пишет на английском языке), может кому понадобиться :)


select to_char(to_date(1234,'J'),'Jsp') from dual

/

One Thousand Two Hundred Thirty-Four
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / числа буквами / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]