File Coverage

blib/lib/Lingua/GLG/Num2Word.pm
Criterion Covered Total %
statement 99 116 85.3
branch 14 32 43.7
condition 0 12 0.0
subroutine 10 12 83.3
pod 4 4 100.0
total 127 176 72.1


line stmt bran cond sub pod time code
1             # For Emacs: -*- mode:cperl; eval: (folding-mode 1); coding:utf-8; -*-
2              
3             package Lingua::GLG::Num2Word;
4             # ABSTRACT: Converts numbers to Galician words
5              
6 1     1   97660 use 5.16.0;
  1         3  
7 1     1   4 use utf8;
  1         2  
  1         31  
8 1     1   36 use warnings;
  1         2  
  1         71  
9              
10             # {{{ use block
11              
12 1     1   5 use Carp;
  1         1  
  1         70  
13 1     1   450 use Export::Attrs;
  1         9107  
  1         7  
14              
15             # }}}
16             # {{{ var block
17             our $VERSION = '0.2603300';
18              
19             # }}}
20              
21             # {{{ num2word
22 1     1 1 108 sub num2glg_cardinal :Export { goto &num2word }
  1     27   1  
  1         5  
  27         243133  
23              
24             sub num2word :Export {
25 33     33 1 87 my @a = @_;
26 33 50       103 @a || return ();
27 33 50       102 my @numbers = wantarray ? @a : shift @a;
28             my @results = map { ## no critic
29 33 50       74 $_ < 0 && return $_;
  33         90  
30 33 50       76 $_ > 999999999999999 && return $_;
31 33 50       107 if ( $_ > 999999999999 ) {
    100          
    100          
32 0         0 my ($bil,$mil) = /(.*)(\d{12})$/;
33 0         0 my $a = num2word($bil);
34 0         0 my $b = num2word($mil);
35 0         0 my $e = "";
36 0 0 0     0 if ($b && $mil =~ /^0{9}/) {
37 0         0 $e = " e";
38             }
39 0 0       0 my $s = $b ? ' ' : '';
40 0 0       0 return $a . ($bil == 1 ? ' billón' : ' billóns') . $e . $s . $b;
41             }
42             elsif ( $_ > 999999 ) {
43 2         20 my ($mil,$uni) = /(.*)(\d{6})$/;
44 2         8 my $a = num2word($mil);
45 2         7 my $b = num2word($uni);
46 2         6 my $e = "";
47 2 50       9 my $s = $b ? ' ' : '';
48 2 50       14 if ($uni =~ /^000\d{0,2}[1-9]\d{0,2}|0\d?[1-9]\d?000|[1-9]0{5}/) {
49 0         0 $e = " e";
50             }
51 2 100       17 return $a . ($mil == 1 ? ' millón' : ' millóns') . $e . $s . $b;
52             }
53             elsif ( $_ > 9999 ) {
54 1         7 $_ =~ /\d\d\d$/;
55 1         8 my $a = num2word($`);
56 1         7 my $b = num2word( 1000 + $& );
57 1         7 return "$a $b";
58             }
59             else {
60 30         97 s!^00+!!;
61 30         61 s!^0+(?=[1-9])!!;
62 30         79 s!9(?=\d\d\d)!nove mil e !;
63 30         72 s!8(?=\d\d\d)!oito mil e !;
64 30         58 s!7(?=\d\d\d)!sete mil e !;
65 30         82 s!6(?=\d\d\d)!seis mil e !;
66 30         62 s!5(?=\d\d\d)!cinco mil e !;
67 30         65 s!4(?=\d\d\d)!catro mil e !;
68 30         68 s!3(?=\d\d\d)!tres mil e !;
69 30         72 s!2(?=\d\d\d)!dous mil e !;
70 30         86 s!1(?=\d\d\d)!mil e !;
71 30         62 s!9(?=\d\d)!novecentos e !;
72 30         51 s!8(?=\d\d)!oitocentos e !;
73 30         82 s!7(?=\d\d)!setecentos e !;
74 30         52 s!6(?=\d\d)!seiscentos e !;
75 30         53 s!5(?=\d\d)!cincocentos e !;
76 30         54 s!4(?=\d\d)!catrocentos e !;
77 30         52 s!3(?=\d\d)!trescentos e !;
78 30         60 s!2(?=\d\d)!douscentos e !;
79 30         52 s!100!cen!;
80 30         75 s!mil e 0+(?=[1-9])!mil e !;
81 30         64 s!1(?=\d\d)!cento e !;
82 30         58 s!9(?=\d)!noventa e !;
83 30         50 s!8(?=\d)!oitenta e !;
84 30         56 s!7(?=\d)!setenta e !;
85 30         57 s!6(?=\d)!sesenta e !;
86 30         51 s!5(?=\d)!cincuenta e !;
87 30         53 s!4(?=\d)!corenta e !;
88 30         59 s!3(?=\d)!trinta e !;
89 30         137 s!2(?=\d)!vinte e !;
90 30         69 s/ e 0+(?=[1-9])/ e /;
91 30         91 s/ e 0+//;
92 30         61 s/19/dezanove/;
93 30         51 s/18/dezaoito/;
94 30         52 s/17/dezasete/;
95 30         51 s/16/dezaseis/;
96 30         857 s/15/quince/;
97 30         66 s/14/catorce/;
98 30         50 s/13/trece/;
99 30         48 s/12/doce/;
100 30         86 s/11/once/;
101 30         50 s/10/dez/;
102 30         59 s/9/nove/;
103 30         54 s/8/oito/;
104 30         50 s/7/sete/;
105 30         76 s/6/seis/;
106 30         57 s/5/cinco/;
107 30         48 s/4/catro/;
108 30         51 s/3/tres/;
109 30         56 s/2/dous/;
110 30         59 s/1/un/;
111 30         66 s/0/cero/;
112              
113 30         91 s!mil e (novecentos|oitocentos|setecentos|seiscentos) e!mil $1 e!;
114 30         52 s!mil e (cincocentos|catrocentos|trescentos|douscentos) e!mil $1 e!;
115 30         47 s!mil e cento!mil cento!;
116              
117 30         121 $_;
118             }
119             } @numbers;
120              
121 30 50       149 return wantarray ? @results : $results[0];
122 1     1   1496 }
  1         1  
  1         4  
123              
124             # }}}
125              
126             # {{{ num2glg_ordinal convert number to ordinal text
127              
128             sub num2glg_ordinal :Export {
129 0     0 1   my $number = shift;
130              
131 0 0 0       croak 'You should specify a number from interval [1, 999_999_999]'
      0        
      0        
132             if !defined $number
133             || $number !~ m{\A\d+\z}xms
134             || $number < 1
135             || $number > 999_999_999;
136              
137             # Irregular ordinals 1-10
138 0           my %irregular = (
139             1 => 'primeiro',
140             2 => 'segundo',
141             3 => 'terceiro',
142             4 => 'cuarto',
143             5 => 'quinto',
144             6 => 'sexto',
145             7 => 'sétimo',
146             8 => 'oitavo',
147             9 => 'noveno',
148             10 => 'décimo',
149             );
150              
151 0 0         return $irregular{$number} if exists $irregular{$number};
152              
153             # For 11+, get the cardinal form and append "ésimo"
154             # Drop trailing vowel if present, then add "ésimo"
155 0           my $cardinal = num2word($number);
156              
157 0           $cardinal =~ s/[aeiou]$//;
158              
159 0           return $cardinal . 'ésimo';
160 1     1   399 }
  1         2  
  1         3  
161              
162             # }}}
163              
164             # {{{ capabilities declare supported features
165              
166             sub capabilities {
167             return {
168 0     0 1   cardinal => 1,
169             ordinal => 1,
170             };
171             }
172              
173             # }}}
174             1;
175             __END__