File Coverage

blib/lib/Lingua/POL/Numbers.pm
Criterion Covered Total %
statement 103 200 51.5
branch 38 126 30.1
condition 13 60 21.6
subroutine 19 23 82.6
pod 15 15 100.0
total 188 424 44.3


line stmt bran cond sub pod time code
1             # For Emacs: -*- mode:cperl; mode:folding; coding:utf-8 -*-
2              
3             package Lingua::POL::Numbers;
4             # ABSTRACT: Number 2 word conversion in POL.
5              
6             # {{{ use block
7              
8 1     1   133094 use v5.32;
  1         4  
9 1     1   7 use warnings;
  1         2  
  1         75  
10 1     1   9 use utf8;
  1         1  
  1         8  
11              
12 1     1   39 use vars qw($Idziesiatka);
  1         17  
  1         99  
13              
14 1     1   687 use lib $ENV{PMLIB_INC};
  1         934  
  1         8  
15              
16 1     1   742 use Carp;
  1         2  
  1         95  
17 1     1   670 use Export::Attrs;
  1         13115  
  1         9  
18              
19             # }}}
20             # {{{ var block
21             our $VERSION = '0.2603230';
22              
23             # }}}
24              
25             # {{{ new
26              
27             sub new {
28 1     1 1 234175 my $class = shift;
29 1   50     10 my $number = shift || '';
30 1         3 $Idziesiatka=0;
31              
32 1         3 my $self = {};
33 1         3 bless $self, $class;
34              
35 1 50       5 if( $number =~ /\d+/ ) {
36 0         0 return( $self->parse($number) );
37             }
38              
39 1         4 return( $self );
40             }
41              
42             # }}}
43             # {{{ parse
44              
45             sub parse :Export {
46 3     3 1 2269 my $self = shift;
47 3         7 my $number = shift;
48              
49 3         9 return( SLOWNIE($number,0) );
50 1     1   296 }
  1         23  
  1         9  
51              
52             # }}}
53             # {{{ currency
54              
55             sub currency {
56 0     0 1 0 my $self = shift;
57 0         0 my $number = shift;
58              
59 0         0 return( SLOWNIE($number,1) );
60             }
61              
62             # }}}
63             # {{{ SLOWNIE
64              
65             sub SLOWNIE {
66 3   100 3 1 14 my $Numer = shift // 0;
67 3         6 my $currency = shift;
68              
69 3         8 my ($temps, $tempd, $tempj, $zlote, $grosze, $Licznik, $grd, $grj, $MiejsceDz, $T_S, $SLOWNIE);
70              
71 3 100       8 if ($Numer == 0) {
72 1 50       4 if ($currency) {
73 0         0 $SLOWNIE = "zero zl zero gr";
74             } else {
75 1         3 $SLOWNIE = "zero";
76             }
77             }
78             else {
79 2 100 66     13 if ($Numer > 9999999999999.99 || $Numer < 0) {
80             #carp "out of range in $Numer";
81 1         4 $SLOWNIE = "out of range";
82             }
83             else {
84 1         51 $Numer = Trim($Numer);
85 1         5 $MiejsceDz = InStr($Numer);
86 1 50 33     7 if ($MiejsceDz > 0 && Right($Numer,2) ne "00") {
    50          
87 0 0       0 if ($currency) {
88 0         0 $grosze = Left(Mid($Numer, $MiejsceDz + 1)."00", 2);
89 0         0 $grd = Dziesiatki(Right($grosze, 2));
90 0 0       0 if ($Idziesiatka!=1) {
91 0         0 $grj = Jednostki(Right($grosze, 1));
92             }
93 0         0 $grosze = " ".$grd.$grj."gr";
94 0         0 $Numer = Trim(Left($Numer, $MiejsceDz - 1));
95             }
96             else {
97 0         0 carp "no decimals allowed in parse mode in $Numer";
98 0         0 $zlote = "no decimals allowed in parse mode in $Numer";
99             }
100             }
101             elsif ($currency) {
102 0         0 $grosze = " zero gr";
103             }
104 1 50 33     9 if ($Numer>0 && ($currency || !$MiejsceDz)) {
    0 33        
      0        
105 1         3 $Licznik = 1;
106 1         4 while ($Numer ne "") {
107 1         3 $tempj = "";
108 1   50     5 $temps = Setki(Right("000".$Numer, 3)) // '';
109 1   50     5 $tempd = Dziesiatki(Right("00".$Numer, 2)) // '';
110 1 50       5 if ($Idziesiatka!=1) {
111 1   50     2 $tempj = Jednostki(Right($Numer, 1)) // '';
112             }
113 1 50 0     4 if ($Licznik==1) {
    0 0        
    0          
114 1         4 $T_S = $temps.$tempd.$tempj;
115             }
116             elsif ($Licznik==2) {
117 0         0 $T_S = $temps.$tempd.$tempj.KTys($Numer);
118             } elsif ($Licznik==3||$Licznik==4||$Licznik==5) {
119 0         0 $T_S = $temps.$tempd.$tempj.KMil($Numer, $Licznik);
120             }
121 1   50     7 $zlote = $T_S.($zlote // '');
122              
123 1 50       4 if (length($Numer) > 3) {
124 0         0 $Numer = Left($Numer, length($Numer) - 3);
125 0         0 $Licznik++;
126             }
127             else {
128 1         4 $Numer = "";
129             }
130             }
131             } elsif ($currency || !$MiejsceDz) {
132 0         0 $zlote = "zero "
133             }
134 1 50 33     5 if ($Numer !~ /^\d+$/ or $Numer > -1) {
135 1 50       14 if ($currency) {
136 0         0 $SLOWNIE = $zlote."zl".$grosze;
137             } else {
138 1         3 $SLOWNIE = $zlote;
139             }
140             }
141             }
142             }
143              
144 3         11 return $SLOWNIE;
145             }
146              
147             # }}}
148             # {{{ KTys
149              
150             sub KTys {
151 0     0 1 0 my $Numer = shift;
152 0         0 my $KTys;
153 0         0 my $tys=Val(Right("000".$Numer, 3));
154              
155 0 0       0 if ($tys == 0) {
156 0         0 $KTys = "";
157             }
158             else {
159 0         0 $tys = Val(Right($Numer, 2));
160 0 0       0 if ($tys == 1) {
161 0         0 $KTys = "ąc ";
162             }
163             else {
164 0 0 0     0 if ($tys == 12 || $tys == 13 || $tys == 14) {
      0        
165 0         0 $KTys = "ęcy ";
166             }
167             else {
168 0         0 $tys = Val(Right($Numer, 1));
169             }
170 0 0 0     0 if ( $tys == 2 || $tys == 3 || $tys == 4) {
      0        
171 0         0 $KTys = "ące ";
172             }
173             else {
174 0         0 $KTys = "ęcy ";
175             }
176             }
177 0         0 $KTys = "tysi".$KTys;
178             }
179              
180 0         0 return $KTys;
181             }
182              
183             # }}}
184             # {{{ KMil
185              
186             sub KMil {
187 0     0 1 0 my ($Numer, $L)=@_;
188 0         0 my ($KMil,$mil);
189 0         0 my @RzadW;
190 0         0 $RzadW[3] = "milion";
191 0         0 $RzadW[4] = "miliard";
192 0         0 $RzadW[5] = "bilion";
193 0         0 $mil = Val(Right("000".$Numer, 3));
194 0 0       0 if ($mil == 0) {
195 0         0 $KMil = "";
196             }
197             else {
198 0         0 $mil = Val(Right($Numer, 2));
199 0 0       0 if ($mil == 1) {
200 0         0 $KMil = " ";
201             }
202             else {
203 0 0 0     0 if ($mil == 12 || $mil == 13 || $mil == 14) {
      0        
204 0         0 $KMil = "ów ";
205             }
206             else {
207 0         0 $mil = Val(Right($Numer, 1));
208 0 0 0     0 if ($mil == 2 || $mil == 3 || $mil == 4) {
      0        
209 0         0 $KMil = "y ";
210             } else {
211 0         0 $KMil = "ów ";
212             }
213             }
214             }
215 0         0 $KMil = $RzadW[$L].$KMil;
216             }
217              
218 0         0 return $KMil;
219             }
220              
221             # }}}
222             # {{{ Setki
223              
224             sub Setki {
225 1     1 1 2 my $Numer=shift;
226 1         3 my ($setka, $wynik);
227 1         3 $setka = Val(Left($Numer, 1));
228 1 50       15 if ($setka == 1) {
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
229 0         0 $wynik= "sto ";
230             } elsif ($setka == 2) {
231 0         0 $wynik = 'dwieście ';
232             } elsif ($setka == 3) {
233 0         0 $wynik = 'trzysta ';
234             } elsif ($setka == 4) {
235 0         0 $wynik = 'czterysta ';
236             } elsif ($setka == 5) {
237 0         0 $wynik = 'pięćset ';
238             } elsif ($setka == 6) {
239 0         0 $wynik = 'sześćset ';
240             } elsif ($setka == 7) {
241 1         3 $wynik = 'siedemset ';
242             } elsif ($setka == 8) {
243 0         0 $wynik = 'osiemset ';
244             } elsif ($setka == 9) {
245 0         0 $wynik = 'dziewięćset ';
246             } else {
247 0         0 $wynik = '';
248             }
249              
250 1         4 return $wynik;
251             }
252              
253             # }}}
254             # {{{ Dziesiatki
255              
256             sub Dziesiatki {
257 1     1 1 2 my $Number = shift;
258 1         2 my $wynik = '';
259              
260 1         3 $Idziesiatka = Val(Left($Number, 1));
261 1 50       5 if ($Idziesiatka == 1) {
262 0         0 my $valnum = Val($Number);
263 0 0       0 if ($valnum == 10) { $wynik = 'dziesięć '; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
264 0         0 elsif ($valnum == 11) { $wynik = 'jedenaście '; }
265 0         0 elsif ($valnum == 12) { $wynik = 'dwanaście '; }
266 0         0 elsif ($valnum == 13) { $wynik = 'trzynaście '; }
267 0         0 elsif ($valnum == 14) { $wynik = 'czternaście '; }
268 0         0 elsif ($valnum == 15) { $wynik = 'piętnaście '; }
269 0         0 elsif ($valnum == 16) { $wynik = 'szesnaście '; }
270 0         0 elsif ($valnum == 17) { $wynik = 'siedemnaście '; }
271 0         0 elsif ($valnum == 18) { $wynik = 'osiemnaście '; }
272 0         0 elsif ($valnum == 19) { $wynik = 'dziewiętnaście '; }
273             }
274             else {
275 1 50       18 if ($Idziesiatka == 2) { $wynik = 'dwadzieścia '; }
  0         0  
276 1 50       5 if ($Idziesiatka == 3) { $wynik = 'trzydzieści '; }
  0         0  
277 1 50       3 if ($Idziesiatka == 4) { $wynik = 'czterdzieści '; }
  0         0  
278 1 50       3 if ($Idziesiatka == 5) { $wynik = 'pięćdziesiąt '; }
  0         0  
279 1 50       3 if ($Idziesiatka == 6) { $wynik = 'sześćdziesiąt '; }
  0         0  
280 1 50       3 if ($Idziesiatka == 7) { $wynik = 'siedemdziesiąt '; }
  0         0  
281 1 50       3 if ($Idziesiatka == 8) { $wynik = 'osiemdziesiąt '; }
  0         0  
282 1 50       4 if ($Idziesiatka == 9) { $wynik = 'dziewięćdziesiąt '; }
  0         0  
283             }
284              
285 1         4 return $wynik;
286             }
287              
288             # }}}
289             # {{{ Jednostki
290              
291             sub Jednostki {
292 1     1 1 19 my $Numer=shift;
293 1         4 my ($jedst, $wynik);
294 1         4 $jedst = Val(Right($Numer, 1));
295 1 50       22 if ($jedst == 1) {
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
296 0         0 $wynik = "jeden ";
297             } elsif ($jedst == 2) {
298 0         0 $wynik = "dwa ";
299             } elsif ($jedst == 3) {
300 0         0 $wynik = "trzy ";
301             } elsif ($jedst == 4) {
302 0         0 $wynik = "cztery ";
303             } elsif ($jedst == 5) {
304 0         0 $wynik = "pięć ";
305             } elsif ($jedst == 6) {
306 0         0 $wynik = "sześć ";
307             } elsif ($jedst == 7) {
308 1         3 $wynik = "siedem ";
309             } elsif ($jedst == 8) {
310 0         0 $wynik = "osiem ";
311             } elsif ($jedst == 9) {
312 0         0 $wynik = "dziewięć ";
313             }
314 1         6 return $wynik;
315             }
316              
317             # }}}
318             # {{{ Left
319              
320             sub Left {
321 2     2 1 15 my ($Numer, $count) = @_;
322 2         5 $Numer = substr($Numer,0,$count);
323              
324 2         9 return $Numer;
325             }
326              
327             # }}}
328             # {{{ Right
329              
330             sub Right {
331 4     4 1 11 my ($Numer, $count) = @_;
332 4         26 $Numer = substr($Numer,-$count);
333              
334 4         19 return $Numer;
335             }
336              
337             # }}}
338             # {{{ Trim
339              
340             sub Trim {
341 1     1 1 4 my $Numer = shift;
342 1         9 $Numer=~s/^\s+//;
343 1         4 $Numer=~s/\s+$//;
344              
345 1         4 return $Numer;
346             }
347              
348             # }}}
349             # {{{ Val
350              
351             sub Val {
352 3     3 1 7 my $Numer = shift;
353              
354 3         9 $Numer=~s/\D//g;
355              
356 3         8 return $Numer;
357             }
358              
359             # }}}
360             # {{{ Mid
361              
362             sub Mid {
363 0     0 1 0 my ($Numer, $count) = @_;
364              
365 0         0 return ($Numer = substr($Numer,$count-1));
366             }
367              
368             # }}}
369             # {{{ InStr
370              
371             sub InStr {
372 1     1 1 3 my $Numer = shift;
373 1         2 my $ret=0;
374 1 50       5 if ($Numer=~/^(\d+)\./) {
375 0         0 $ret=length($1)+1;
376             }
377              
378 1         2 return $ret;
379             }
380              
381             # }}}
382              
383             1;
384              
385             # {{{ POD
386              
387             =pod
388              
389             =encoding utf-8
390              
391             =head1 NAME
392              
393             Lingua::POL::Numbers - Perl module for converting numeric values into their Polish equivalents
394              
395             =head1 VERSION
396              
397             version 0.2603230
398              
399             =head1 DESCRIPTION
400              
401             Number 2 word conversion in POL.
402              
403             This is PetaMem release in iso-639-3 namespace.
404              
405             =head1 SYNOPSIS
406              
407             use Lingua::POL::Numbers;
408              
409             my $numbers = Lingua::POL::Numbers->new;
410              
411              
412             my $text = $numbers->parse( 123 );
413              
414             # prints 'sto dwadzieścia trzy'
415             print $text;
416              
417              
418             my $currency = $numbers->currency ( 123.45 );
419              
420             # prints 'sto dwadzieścia trzy zl czterdzieści pięć gr'
421             print $currency;
422              
423             =head1 FUNCTIONS
424              
425             =over
426              
427             =item new
428              
429             Constructor
430              
431             =item parse
432              
433             Converts number into Polish
434              
435             =item Dziesiatki
436              
437             private
438              
439             =item InStr
440              
441             private
442              
443             =item Jednostki
444              
445             private
446              
447             =item KMil
448              
449             private
450              
451             =item KTys
452              
453             private
454              
455             =item Left
456              
457             private
458              
459             =item Mid
460              
461             private
462              
463             =item Right
464              
465             private
466              
467             =item SLOWNIE
468              
469             private
470              
471             =item Setki
472              
473             private
474              
475             =item Trim
476              
477             private
478              
479             =item Val
480              
481             private
482              
483             =item currency
484              
485             private
486              
487             =back
488              
489             =head1 KNOWN BUGS
490              
491             None, but that does not mean there are not any.
492              
493             =head1 AUTHOR
494              
495             Henrik Steffen,
496              
497             Maintenance
498             PetaMem s.r.o.,
499              
500             =head1 LICENSE
501              
502             Original license is not known.
503             PetaMem added Perl 5 licesne as default.
504              
505             =cut
506              
507             # }}}