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

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

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


Жаль, нуна, причем очень, на перле :) А мож ресурсы подскажешь где поискать?
...
Рейтинг: 0 / 0
10.03.2006, 17:53:18
    #33593650
Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Продцедура написания чисел прописью
VERSУ меня есть функция одна, но на пхп к сожалению)
-------------------------------
www.free-lancer.ru
какая разница, PHP, PERL алгоритм один! показывай
...
Рейтинг: 0 / 0
10.03.2006, 18:08:05
    #33593676
VERS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Продцедура написания чисел прописью
Копирайт не мой)
Код: 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
11.03.2006, 11:10:16
    #33594243
g613
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Продцедура написания чисел прописью
Sasha_Greck VERSУ меня есть функция одна, но на пхп к сожалению)


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

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

Код: 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
13.03.2006, 10:12:59
    #33595651
Sasha_Greck
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Продцедура написания чисел прописью
Спасибо вам огромное сегодня буду пробовать о результатах отпишусь под вечер.
--
Чем дальше в лес, тем ... тем больше вылез!
...
Рейтинг: 0 / 0
13.03.2006, 12:55:13
    #33596292
Sasha_Greck
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Продцедура написания чисел прописью
Остановился я на варианте кода который просто вставил в свой модуль:

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


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