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

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

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

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

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

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

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

исходик - в раздел работа. хотя и десь вы модете предложить свою цену.
аффтопитезь
...
Рейтинг: 0 / 0
числа буквами
    #34206962
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
начни с того, что найди старший разряд, а дальше легко.
...
Рейтинг: 0 / 0
числа буквами
    #34207184
Фотография акуз-лингвист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блондинка в банке (на предложение написать сумму прописью):
- молодой человек, вы в своём уме? как я напишу цифры буквами???
...
Рейтинг: 0 / 0
числа буквами
    #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
числа буквами
    #34207686
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на языке павербилдера и с украинской версией
http://users.iptelecom.net.ua/~agp1/software/num2word.tar.gz
...
Рейтинг: 0 / 0
числа буквами
    #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
числа буквами
    #34207951
ddelete
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасиб :) всем....
я вот и свой вариант сделал..если кому нужно в перле...пишите..
...
Рейтинг: 0 / 0
числа буквами
    #34208405
Den_di
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklinберешь остаток от деления на 10. пишешь (в ум) "стольоко-то" (перебор - вручную, т.е. 1 - "один", 2- "два"... )
если первый минус, то еще пишешь "минус".
теперь все из ума в обратном порядке.

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

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

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

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

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

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

Скряга (!)
...
Рейтинг: 0 / 0
числа буквами
    #34208775
1010100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на дельфи
...
Рейтинг: 0 / 0
числа буквами
    #34208776
1010100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
без копеек
...
Рейтинг: 0 / 0
числа буквами
    #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]