File Coverage

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