powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl) Продцедура написания чисел прописью
9 сообщений из 9, страница 1 из 1
(Perl) Продцедура написания чисел прописью
    #33593591
Sasha_Greck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем. Такой вопросик, есть ли продцедурка такая чтобы на входе было цисловое выражение, а на выходе его прописной буквенный название.

43,45 -> сороктри грн. 45 коп.

--
Чем дальше в лес, тем ... тем больше вылез!
...
Рейтинг: 0 / 0
(Perl) Продцедура написания чисел прописью
    #33593606
VERS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть функция одна, но на пхп к сожалению)
-------------------------------
www.free-lancer.ru
...
Рейтинг: 0 / 0
(Perl) Продцедура написания чисел прописью
    #33593624
Sasha_Greck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VERSУ меня есть функция одна, но на пхп к сожалению)


Жаль, нуна, причем очень, на перле :) А мож ресурсы подскажешь где поискать?
...
Рейтинг: 0 / 0
(Perl) Продцедура написания чисел прописью
    #33593650
Фотография Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VERSУ меня есть функция одна, но на пхп к сожалению)
-------------------------------
www.free-lancer.ru
какая разница, PHP, PERL алгоритм один! показывай
...
Рейтинг: 0 / 0
(Perl) Продцедура написания чисел прописью
    #33593676
VERS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Копирайт не мой)
Код: 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.
function propis($rub)
{
$dop0 = Array("рублей","тысяч","миллионов","миллиардов");
$dop1 = Array("рубль","тысяча","миллион","миллиард");
$dop2 = Array("рубля","тысячи","миллиона","миллиарда");
$s1 = Array("","один","два","три","четыре","пять","шесть","семь","восемь","девять");
$s11 = Array("","одна","две","три","четыре","пять","шесть","семь","восемь","девять");
$s2 = Array("","десять","двадцать","тридцать","сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят","девяносто");
$s22 = Array("десять","одиннадцать","двенадцать","тринадцать","четырнадцать","пятнадцать","шестнадцать","семнадцать","восемнадцать","девятнадцать");
$s3 = Array("","сто","двести","триста","четыреста");

if($rub== 0 )
{// если это  0 
return "ноль ".$dop0[ 0 ];
}

// разбиваем полученное число на тройки и загоняем в массив $triplet
$t_count = ceil(strlen($rub)/ 3 );
for($i= 0 ;$i<$t_count;$i++)
{
$k = $t_count - $i -  1 ;
$triplet[$k] = $rub% 1000 ;
$rub = floor($rub/ 1000 );
}

// пробегаем по триплетам
for($i= 0 ;$i<$t_count;$i++)
{
$t = $triplet[$i]; // это текущий триплет - с ним и работаем
$k = $t_count - $i -  1 ;
$n1 = floor($t/ 100 );
$n2 = floor(($t-$n1* 100 )/ 10 );
$n3 = $t-$n1* 100 -$n2* 10 ;

// обрабатываем сотни
if($n1< 5 ) $res .= $s3[$n1]." ";
elseif($n1) $res .= $s1[$n1]."сот ";

if($n2> 1 )
{// второй десяток
$res .= $s2[$n2]." ";
if($n3 and $k== 1 )
{// если есть единицы в триплете и это триплет ТЫСЯЧ
$res .= $s11[$n3]." ";
}
elseif($n3)
{
$res .= $s1[$n3]." ";
}
}
elseif($n2== 1 )
{
$res .= $s22[$n3]." ";
}
elseif($n3 and $k== 1 )
{// если есть единицы в триплете и это триплет ТЫСЯЧ
$res .= $s11[$n3]." ";
}
elseif($n3)
{
$res .= $s1[$n3]." ";
}

// прилепляем в конец триплета коммент
if($n3== 1  and $n2!= 1 )
{// в конце триплета стоит  1 , но не  11 .
$res .= $dop1[$k]." ";
}
elseif($n3> 1  and $n3< 5  and $n2!= 1 )
{// в конце триплета стоит  2 ,  3  или  4 , но не  12 ,  13  или  14 
$res .= $dop2[$k]." ";
}
elseif($t or $k== 0 )
{
$res .= $dop0[$k]." ";
}
}
return $res;
}
-------------------------------
www.free-lancer.ru
...
Рейтинг: 0 / 0
(Perl) Продцедура написания чисел прописью
    #33594243
g613
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sasha_Greck VERSУ меня есть функция одна, но на пхп к сожалению)


Жаль, нуна, причем очень, на перле :) А мож ресурсы подскажешь где поискать?
я себе примерно так писал...

только там таки рубли, а не грины... :)
...
Рейтинг: 0 / 0
(Perl) Продцедура написания чисел прописью
    #33594866
ap99ap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хоть и стыдно мне немного,
но приведу все же функцию из нашего фреймворка

Код: 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.
#
# Get the numeral from number
#
# Parameters
#
#               number
#               formatted string - numeral in singular
#               formatted string - numeral in plural
#               formatted string - numeral in neutral gender
#               gender for singular and plural ("m" or "f")
#
#       String Format: "first part %s second part"
#
#
# Result
#
#               Formatted string
#
sub numeralFromNumber {

    my $number   = $_[ 0 ];
    my $singular = $_[ 1 ];
    my $plural   = $_[ 2 ];
    my $neutral  = $_[ 3 ];
    my $gender   = $_[ 4 ];

    my $numeral = '';
    my $format  = '';

    if( $number ==  0  ) {
        $format  = $neutral;
        $numeral = 'ноль';
    } elsif( $number ==  1  ) {
        $format  = $singular;
        $numeral = ($gender eq "m") ? "один" : "одна";
    } elsif( $number ==  2  ) {
        $format  = $neutral;
        $numeral = ($gender eq "m") ? "два" : "две";
    } elsif( $number ==  3  ) {
        $format  = $neutral;
        $numeral = "три";
    } elsif( $number ==  4  ) {
        $format  = $neutral;
        $numeral = "четыре";
    } elsif( ($number %  100 ) >  10  && ($number %  100 ) <  20  ) {
        $format  = $plural;
        $numeral = $number;
    } elsif( $number %  10  ==  1  ) {
        $format  = $singular;
        $numeral = $number;
    } elsif( ($number %  10 ) >  0  && ($number %  10 ) <  5  ) {
        $format  = $neutral;
        $numeral = $number;
    } else {
        $format  = $plural;
        $numeral = $number;
    }

    return sprintf( $format, $numeral );
}
#
# // numeralFromNumber()
#

Код: plaintext
1.
WBR,
    A.P.
...
Рейтинг: 0 / 0
(Perl) Продцедура написания чисел прописью
    #33595651
Sasha_Greck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо вам огромное сегодня буду пробовать о результатах отпишусь под вечер.
--
Чем дальше в лес, тем ... тем больше вылез!
...
Рейтинг: 0 / 0
(Perl) Продцедура написания чисел прописью
    #33596292
Sasha_Greck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Остановился я на варианте кода который просто вставил в свой модуль:

Код: 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.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
sub digit_to_money_string {
	my $digit = shift;
	local $_;
#
# Проверка на отрицательность числа
#
	my $sign =  1  if $digit =~ s/^-+//;
#
# Удаляем нули из начала числа
#
	$digit =~ s#^ 0 +##;

	my ( $b_dig, $s_dig ) = ( split( m/[,.]/, $digit,  2  ) );
#
# Очищаем числа от `лишних' символов ( 100_000,43 )
#
	if ( defined $b_dig and length $b_dig ) {
		$b_dig =~ s#[^\d]##sg;
	} else {
		$b_dig = 0;
	}
	if ( defined $s_dig and length $s_dig ) {
		$s_dig =~ s#[^\d]##sg;
	} else {
		$s_dig = 0;
	}
#
# Округляем копейки в большую сторону, если в результате округления
# получаем рубль, то приплюсовываем его к b_dig ( рублям )
#
	if ( sprintf('% 0 .2f'		],
			2	=> [['0';
	} else {
		$s_dig = substr( sprintf('% 0 .2f', "0.$s_dig" ), 2 );
	}

	my @array = split( //, ( $b_dig || 0 ) );
#
# Определяем разрядность числа.
#
	my $class_id = int( scalar ( @array ) / 3);
	$class_id++ if ( scalar ( @array ) % 3 );
#
# Неподдерживаемая разрядность.
#
	return $digit if $class_id > 12;

	my $digits_name = {
			0	=> ['ноль',			'',				''			],
			1	=> [['один','одна'],	'десять',		'сто'		],
			2	=> [['два','две'],		'двадцать',		'двести'	],
			3	=> ['три',		'тридцать',		'триста'	],
			4	=> ['четыре',	'сорок',		'четыреста'	],
			5	=> ['пять',		'пятьдесят',	'пятьсот'	],
			6	=> ['шесть',	'шестьдесят',	'шестьсот'	],
			7	=> ['семь',		'семьдесят',	'семьсот'	],
			8	=> ['восемь',	'восемьдесят',	'восемьсот'	],
			9	=> ['девять',	'девяносто',	'девятьсот'	],
		};

	my $dec_digits = {
				11	=> 'одинадцать',
				12	=> 'двенадцать',
				13	=> 'тринадцать',
				14	=> 'четырнадцать',
				15	=> 'пятнадцать',
				16	=> 'шестнадцать',
				17	=> 'семнадцать',
				18	=> 'восемнадцать',
				19	=> 'девятнадцать'
			};

	my $digits_class = {
			'- 1 '=>	[ 1,	'копейка',		'копеек',		'копейки'	],
			0	=>	[ 0,	'гривна',		'гривен',		'гривны'		],
			1	=>	[ 1,	'тысяча',		'тысяч',		'тысячи'	],
			2	=>	[ 0,	'миллион',		'миллионов',	'миллиона'	],
			3	=>	[ 0,	'миллиард',		'миллиардов',	'миллиарда'	],
			4	=>	[ 0,	'триллион',		'триллионов',	'триллиона'	],
			5	=>	[ 0,	'квадриллион',	'квадриллионов',	'квадриллиона' ],
			6	=>	[ 0,	'квинтиллиан',	'квинтиллианов','квинтиллиана'],
			7	=>	[ 0,	'секстиллион',	'секстиллионов','секстиллиона'],
			8	=>	[ 0,	'септиллион',	'септиллионов',	'септиллиона'],
			9	=>	[ 0,	'октилион',		'октлионов',	'октилиона'	],
			10	=>	[ 0,	'нониллион',	'нониллионов',	'ноннилиона'],
			11	=>	[ 0,	'дециллион',	'дециллионов',	'дециллиона' ]
		};
#
# Определяем длину левой `тройки'...
#
	my $id =  0 ;
	unless ( ( scalar @array ) %  3  ) {
		$id =  2 ;
	} else {
		$id = ( ( scalar @array ) %  3  ) -  1 ;
	}

	my $str		= '';
	my $sub_str	=  0 ;
	my $tvar	=  0 ;

	if ( $array[ 0 ] ==  0  ) {
#
# Если рублей таки ноль, то так и пишем 'ноль рублей',
# если не надо то просто закомнтировать следующую строку...
#
		$str .= $digits_name->{'0'}->[ 0 ] . ' ' . $digits_class->{'0'}->[ 2 ] . ' ';
	} else {
		while ( defined ( $_ = shift @array ) ) {
			if ( $_ >  0  ) {
				if ( $_ ==  1  and $id ==  1  ) {
#
# Считаем сумму для использования в sub num()
#
					$sub_str += $_ *  10 ;
					if ( defined ( $tvar = shift @array ) and $tvar >  0  ) {
						$str .= $dec_digits->{ $_ . $tvar };
						$sub_str += $tvar;
						$id--;
					} else {
						unshift @array, $tvar;
						if ( ref $digits_name->{$_}->[$id] eq 'ARRAY' ) {
							$str .= $digits_name->{$_}->[$id]->[$digits_class->{$class_id- 1 }->[ 0 ]];
						} else {
							$str .= $digits_name->{$_}->[$id];
						}
					}
				} else {
#
# Считаем сумму для использования в sub num()
#
					$sub_str += ( $_ * (  10  ** $id ) );
					if ( ref $digits_name->{$_}->[$id]  eq 'ARRAY' ) {
						$str .= $digits_name->{$_}->[$id]->[$digits_class->{$class_id- 1 }->[ 0 ]];
					} else {
						$str .= $digits_name->{$_}->[$id];
					}
				}
				$str .= ' ';
			}
			if ( --$id == -1 ) {
				$id =  2 ;
				$class_id--;
				if ( $sub_str >  0  ) {
					$str .= num( $sub_str, ( @{ $digits_class->{$class_id} } )[  1  ..  3  ] ) . ' ';
				} elsif ( $class_id ==  0  ) {
					$str .= $digits_class->{$class_id}->[ 2 ] . ' ';
				}
				$sub_str =  0 ;
			}
		}
	}

	$str .= $s_dig . ' ' . num( $s_dig, ( @{ $digits_class->{ '-1' } } )[  1  ..  3  ] );

	if ( defined $sign ) {
		$str = 'минус ' . $str;
	}

	$s_dig = substr( $str,  0 ,  1  );
#
# В том случае где оно пользовалось оказалось проще
# так, чем через use locale & ucfirst...
#
	if ( $s_dig =~ tr/абвгдеёжзийклмнопрстуфхцчшщъыьэюя/АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ/ ) {
		substr( $str,  0 ,  1 , $s_dig );
	}

	return $str;
}

#
# Используется при переводе денежного числа в строку прописью..
#

sub num {
	my $d1 = $_[ 0 ] %  10 ;
	my $d2 = int( ( $_[ 0 ] %  100  ) /  10  );
	return $_[ 2 ] if ( ( $d2 ==  1  ) or ( $d1 =~ /[ 05 - 9 ]/ ) );
	return $_[ 1 ] if ( $d1== 1  );
	return $_[ 3 ];
}

Вызов функции:
Код: plaintext
1.
my $words;
$words = digit_to_money_string($totalaktsumm);

Работает чудесно :) Всем спасибо.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl) Продцедура написания чисел прописью
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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