File Coverage

blib/lib/Lingua/RUS/Number.pm
Criterion Covered Total %
statement 69 69 100.0
branch 20 28 71.4
condition 23 31 74.1
subroutine 10 10 100.0
pod 2 2 100.0
total 124 140 88.5


line stmt bran cond sub pod time code
1             # For Emacs: -*- mode:cperl; eval: (folding-mode 1); coding:utf-8 -*-
2             #
3             # (c) 2002-2010 PetaMem, s.r.o.
4             #
5              
6             package Lingua::RUS::Number;
7             # ABSTRACT: Number 2 word conversion in RUS.
8              
9             # {{{ use block
10              
11 1     1   104806 use 5.10.1;
  1         11  
12              
13 1     1   5 use strict;
  1         2  
  1         44  
14 1     1   7 use warnings;
  1         3  
  1         49  
15 1     1   3 use utf8;
  1         3  
  1         5  
16              
17 1     1   530 use Export::Attrs;
  1         8847  
  1         8  
18              
19             # }}}
20             # {{{ variables declaration
21             our $VERSION = '0.2603230';
22              
23             # Preloaded methods go here.
24 1     1   106 use vars qw(%diw %nom);
  1         2  
  1         522  
25              
26             %diw = (
27             0 => {
28             0 => { 0 => "ноль", 1 => 1},
29             1 => { 0 => "", 1 => 2},
30             2 => { 0 => "", 1 => 3},
31             3 => { 0 => "три", 1 => 0},
32             4 => { 0 => "четыре", 1 => 0},
33             5 => { 0 => "пять", 1 => 1},
34             6 => { 0 => "шесть", 1 => 1},
35             7 => { 0 => "семь", 1 => 1},
36             8 => { 0 => "восемь", 1 => 1},
37             9 => { 0 => "девять", 1 => 1},
38             10 => { 0 => "десять", 1 => 1},
39             11 => { 0 => "одинадцать", 1 => 1},
40             12 => { 0 => "двенадцать", 1 => 1},
41             13 => { 0 => "тринадцать", 1 => 1},
42             14 => { 0 => "четырнадцать", 1 => 1},
43             15 => { 0 => "пятнадцать", 1 => 1},
44             16 => { 0 => "шестнадцать", 1 => 1},
45             17 => { 0 => "семнадцать", 1 => 1},
46             18 => { 0 => "восемнадцать", 1 => 1},
47             19 => { 0 => "девятнадцать", 1 => 1},
48             },
49             1 => {
50             2 => { 0 => "двадцать", 1 => 1},
51             3 => { 0 => "тридцать", 1 => 1},
52             4 => { 0 => "сорок", 1 => 1},
53             5 => { 0 => "пятьдесят", 1 => 1},
54             6 => { 0 => "шестьдесят", 1 => 1},
55             7 => { 0 => "семьдесят", 1 => 1},
56             8 => { 0 => "восемьдесят", 1 => 1},
57             9 => { 0 => "девяносто", 1 => 1},
58             },
59             2 => {
60             1 => { 0 => "сто", 1 => 1},
61             2 => { 0 => "двести", 1 => 1},
62             3 => { 0 => "триста", 1 => 1},
63             4 => { 0 => "четыреста", 1 => 1},
64             5 => { 0 => "пятьсот", 1 => 1},
65             6 => { 0 => "шестьсот", 1 => 1},
66             7 => { 0 => "семьсот", 1 => 1},
67             8 => { 0 => "восемьсот", 1 => 1},
68             9 => { 0 => "девятьсот", 1 => 1}
69             }
70             );
71              
72             %nom = (
73             0 => {0 => "копейки", 1 => "копеек", 2 => "одна копейка", 3 => "две копейки"},
74             1 => {0 => "рубля", 1 => "рублей", 2 => "один рубль", 3 => "два рубля"},
75             2 => {0 => "тысячи", 1 => "тысяч", 2 => "одна тысяча", 3 => "две тысячи"},
76             3 => {0 => "миллиона", 1 => "миллионов", 2 => "один миллион", 3 => "два миллиона"},
77             4 => {0 => "миллиарда",1 => "миллиардов",2 => "один миллиард",3 => "два миллиарда"},
78             5 => {0 => "триллиона",1 => "триллионов",2 => "один триллион",3 => "два триллиона"}
79             );
80              
81             my $out_rub;
82              
83             # }}}
84              
85             # {{{ rur_in_words
86              
87             sub rur_in_words :Export {
88 6   100 6 1 227243 my ($sum) = shift // 0;
89 6         50 my ($retval, $i, $sum_rub, $sum_kop);
90              
91 6         15 $retval = "";
92 6 100       21 $out_rub = ($sum >= 1) ? 0 : 1;
93 6         27 $sum_rub = sprintf("%d", $sum);
94 6 50       26 $sum_rub-- if (($sum_rub - $sum) > 0);
95 6         55 $sum_kop = sprintf("%0.2f", ($sum - $sum_rub)) * 100;
96 6         17 my $kop = get_string($sum_kop, 0);
97              
98 6   66     48 for ($i=1; $i<6 && $sum_rub >= 1; $i++) {
99 4         11 my $sum_tmp = $sum_rub / 1000;
100 4         55 my $sum_part = sprintf("%0.3f", $sum_tmp - sprintf("%d", $sum_tmp) ) * 1000;
101 4         10 $sum_rub = sprintf("%d", $sum_tmp);
102              
103 4 50       16 $sum_rub-- if ($sum_rub - $sum_tmp > 0);
104 4         11 $retval = get_string($sum_part, $i)." ".$retval;
105             }
106 6 50       16 $retval .= " рублей" if ($out_rub == 0);
107 6         15 $retval .= " ".$kop;
108 6         51 $retval =~ s/\s+/ /g;
109              
110 6         24 return $retval;
111 1     1   5 }
  1         2  
  1         5  
112              
113             # }}}
114             # {{{ get_string
115              
116             sub get_string :Export{
117 17   100 17 1 6033 my $sum = shift // return;
118 15         30 my $nominal = shift;
119 15         33 my ($retval, $nom) = ('', -1);
120              
121 15 50 66     115 if ((!$nominal && $sum < 100) || ($nominal > 0 && $nominal < 6 && $sum < 1000)) {
      33        
      33        
      66        
122 15         54 my $s2 = sprintf("%d", $sum / 100);
123 15 100       81 if ($s2 > 0) {
124 2         9 $retval .= ' '.$diw{2}{$s2}{0};
125 2         5 $nom = $diw{2}{$s2}{1};
126             }
127 15         39 my $sx = sprintf("%d", $sum - $s2 * 100);
128 15 50       44 $sx-- if ($sx - ($sum - $s2*100) > 0);
129              
130 15 100 100     92 if (($sx<20 && $sx>0) || ($sx == 0 && !$nominal)) {
      66        
      100        
131 12         45 $retval .= " ".$diw{0}{$sx}{0};
132 12         30 $nom = $diw{0}{$sx}{1};
133             } else {
134 3         10 my $s1 = sprintf("%d", $sx / 10);
135 3 50       13 $s1-- if (($s1 - $sx/10) > 0);
136 3         11 my $s0 = sprintf("%d", $sum - $s2*100 - $s1*10 + 0.5);
137 3 50       10 if ($s1 > 0) {
138 3         10 $retval .= ' '.$diw{1}{$s1}{0};
139 3         7 $nom = $diw{1}{$s1}{1};
140             }
141 3 100       10 if ($s0 > 0) {
142 2         6 $retval .= ' '.$diw{0}{$s0}{0};
143 2         6 $nom = $diw{0}{$s0}{1};
144             }
145             }
146             }
147 15 50       83 if ($nom >= 0) {
148 15 100       80 $retval .= defined $nominal ? ' '.$nom{$nominal}{$nom} : '';
149 15 100 100     71 $out_rub = 1 if (defined $nominal && $nominal == 1);
150             }
151 15         115 $retval =~ s/^\s*//g;
152 15         149 $retval =~ s/\s*$//g;
153              
154 15         63 return $retval;
155 1     1   639 }
  1         2  
  1         4  
156              
157             # }}}
158              
159              
160             1;
161              
162             __END__