File Coverage

blib/lib/Lingua/NLD/Numbers.pm
Criterion Covered Total %
statement 81 111 72.9
branch 32 50 64.0
condition 38 63 60.3
subroutine 10 10 100.0
pod 2 2 100.0
total 163 236 69.0


line stmt bran cond sub pod time code
1             # For Emacs: -*- mode:cperl; mode:folding -*-
2              
3             package Lingua::NLD::Numbers;
4             # ABSTRACT: Numbers 2 word conversion in NLD.
5              
6             # {{{ use block
7              
8 1     1   35804 use 5.10.1;
  1         6  
  1         54  
9              
10 1     1   6 use warnings;
  1         3  
  1         46  
11 1     1   5 use strict;
  1         6  
  1         46  
12              
13 1     1   1364 use Perl6::Export::Attrs;
  1         19283  
  1         8  
14              
15             # }}}
16             # {{{ variables declaration
17              
18             our $VERSION = 0.0682;
19              
20             my $numbers = {
21             0 => 'nul',
22             1 => 'een',
23             2 => 'twee',
24             3 => 'drie',
25             4 => 'vier',
26             5 => 'vijf',
27             6 => 'zes',
28             7 => 'zeven',
29             8 => 'acht',
30             9 => 'negen',
31             10 => 'tien',
32             11 => 'elf',
33             12 => 'twaalf',
34             13 => 'dertien',
35             14 => 'veertien',
36             15 => 'vijftien',
37             16 => 'zestien',
38             17 => 'zeventien',
39             18 => 'achtien',
40             19 => 'negentien',
41             20 => 'twintig',
42             30 => 'dertig',
43             40 => 'veertig',
44             50 => 'vijftig',
45             60 => 'zestig',
46             70 => 'zeventig',
47             80 => 'tachtig',
48             90 => 'negentig',
49             };
50              
51             # }}}
52              
53             # {{{ new
54              
55             sub new {
56 1     1 1 16 my $class = shift;
57 1   50     9 my $number = shift || '';
58              
59 1         2 my $self = {};
60 1         3 bless $self, $class;
61              
62 1 50       5 if( $number =~ /\d+/ ) {
63 0         0 return( $self->parse($number) );
64             };
65              
66 1         3 return( $self );
67             };
68              
69             # }}}
70             # {{{ parse
71              
72             sub parse :Export {
73 4     4 1 1646 my $self = shift;
74 4   100     13 my $number = shift // return '';
75              
76 3         3 my $digits;
77 3         4 my $ret = '';
78              
79 3 50       9 if( defined($numbers->{$number}) ) {
80 0         0 $ret = $numbers->{$number};
81             }
82             else {
83 3         6 my $ret_array = [];
84              
85 3         13 @{$digits} = reverse( split('', $number) );
  3         9  
86              
87             # tens of billions
88 3 50 66     27 if( defined($digits->[10]) && ($digits->[10] != 0) ) {
    50 66        
89 0         0 my $temp = $self->_formatTens( $digits->[9], $digits->[10] );
90 0         0 unshift @{$ret_array}, "$temp biljoen";
  0         0  
91             }
92             elsif( defined($digits->[9]) && ($digits->[9] != 0) ) {
93 0         0 unshift @{$ret_array}, $self->_formatLarge( $digits->[9], ' biljoen' );
  0         0  
94             };
95              
96             # hundreds of millions
97 3 50 66     18 if( defined($digits->[8]) && ($digits->[8] != 0) ) {
98 0 0 0     0 if( ($digits->[7] == 0) && ($digits->[6] == 0) ) {
99 0         0 unshift @{$ret_array}, $self->_formatLarge( $digits->[8], ' honderd miljard' );
  0         0  
100             }
101             else {
102 0         0 unshift @{$ret_array}, $self->_formatLarge( $digits->[8], ' honderd' );
  0         0  
103             };
104             };
105              
106             # tens of millions
107 3 50 66     31 if( defined($digits->[7]) && ($digits->[7] != 0) ) {
    50 66        
108 0         0 my $temp = $self->_formatTens( $digits->[6], $digits->[7] );
109 0         0 unshift @{$ret_array}, "$temp miljard";
  0         0  
110             }
111             elsif( defined($digits->[6]) && ($digits->[6] != 0) ) {
112 0         0 unshift @{$ret_array}, $self->_formatLarge( $digits->[6], ' miljard' );
  0         0  
113             };
114              
115             # hundreds of thousands
116 3 100 100     15 if( defined($digits->[5]) && ($digits->[5] != 0) ) {
117 1 50 33     5 if( ($digits->[4] == 0) && ($digits->[3] == 0) ) {
118 0         0 unshift @{$ret_array}, $self->_formatLarge( $digits->[5], ' honderd duizend' );
  0         0  
119             }
120             else {
121 1         14 unshift @{$ret_array}, $self->_formatLarge( $digits->[5], ' honderd' );
  1         5  
122             };
123             };
124              
125             # tens of thousands
126 3 100 100     552 if( defined($digits->[4]) && ($digits->[4] != 0) ) {
    50 66        
    50 33        
      66        
127 1         3 my $temp = $self->_formatTens( $digits->[3], $digits->[4] );
128 1         2 unshift @{$ret_array}, "$temp duizend";
  1         3  
129             }
130             elsif( defined($digits->[3]) && ($digits->[3] == 1) && $number<2000) { # VSM - BUG
131 0         0 unshift @{$ret_array}, ' duizend';
  0         0  
132             }
133             elsif( defined($digits->[3]) && ($digits->[3] != 0) ) {
134 0         0 unshift @{$ret_array}, $self->_formatLarge( $digits->[3], ' duizend' );
  0         0  
135             };
136              
137             # hundreds
138 3 100 66     192 if( defined($digits->[2]) && ($digits->[2] == 1) ) {
    100 66        
139 1         2 unshift @{$ret_array}, 'honderd';
  1         3  
140             }
141             elsif( defined($digits->[2]) && ($digits->[2] != 0) ) {
142 1         1 unshift @{$ret_array}, $self->_formatLarge( $digits->[2], 'honderd' );
  1         3  
143             };
144              
145             # tens
146 3         3 unshift @{$ret_array}, $self->_formatTens( $digits->[0], $digits->[1], 'en' );
  3         11  
147              
148 3         8 $ret = $self->_sortReturn( $ret_array, $digits );
149             };
150              
151 3         8 return( $ret );
152 1     1   894 };
  1         2  
  1         6  
153              
154             # }}}
155             # {{{ _sortReturn
156              
157             sub _sortReturn {
158 3     3   4 my $self = shift;
159 3         2 my $ret_array = shift;
160 3         4 my $digits = shift;
161              
162 3         3 my $large_nums = 0;
163 3         3 my $ret = '';
164              
165 3         3 my $size = @{$ret_array};
  3         3  
166              
167 3 50       10 if( $size == 1 ) {
    100          
168 0         0 return( $ret_array->[0] );
169             }
170             elsif( $size > 1 ) {
171 2         2 $large_nums = 1;
172             };
173              
174 3         7 for( my $i = $size; $i > 0; $i-- ) {
175              
176 6 100       15 if( defined($ret_array->[$i]) ) {
177 4 100       19 if( $ret_array->[$i] =~ /(miljard|duizend)/ ) {
178 1         3 $ret .= $ret_array->[$i] .', ';
179             }
180             else {
181 3         8 $ret .= $ret_array->[$i] .' ';
182             };
183             };
184             };
185              
186 3 100 66     22 if( ($digits->[0] == 0) && ($digits->[1] == 0) ) {
    50 33        
      33        
187             # do nothing
188             }
189             elsif( ($digits->[0] == 0) || ($digits->[1] == 0) || ($digits->[1] == 1) ) {
190 0 0       0 if( $large_nums ) {
191 0         0 $ret .= ' en ';
192             };
193 0         0 $ret .= $ret_array->[0];
194             }
195             else {
196 2         4 $ret .= ' '. $ret_array->[0];
197             };
198              
199 3         28 $ret =~ s/(^ |\s{2,}| $)/ /g;
200              
201 3         9 return( $ret );
202             };
203              
204             # }}}
205             # {{{ _formatTens
206              
207             sub _formatTens {
208 4     4   5 my $self = shift;
209 4         5 my $units = shift;
210 4         3 my $tens = shift;
211 4   100     11 my $en = shift || ' en ';
212              
213             # Both digits are zero
214 4 100 66     11 unless( $units || $tens ) {
215 1         2 return;
216             };
217              
218 3 50 33     18 if( $tens == 0 ) {
    50          
219 0         0 return( $numbers->{$units} );
220             }
221             elsif( ($tens == 1) || ($units == 0) ) {
222 0         0 my $temp = $tens . $units;
223 0         0 return( $numbers->{$temp} );
224             };
225              
226 3         5 my $temp = $tens . 0;
227 3         10 return( $numbers->{$units} . $en . $numbers->{$temp} );
228             };
229              
230             # }}}
231             # {{{ _formatLarge
232              
233             sub _formatLarge {
234 2     2   2 my $self = shift;
235 2         3 my $digit = shift;
236 2         2 my $word = shift;
237              
238 2         4 my $ret = "$numbers->{$digit}$word";
239              
240 2         5 return( $ret );
241             };
242              
243             # }}}
244              
245             1;
246              
247             =pod
248              
249             =head1 NAME
250              
251             Lingua::NLD::Numbers
252              
253             =head1 VERSION
254              
255             version 0.0682
256              
257             =head1 DESCRIPTION
258              
259             Numbers 2 word conversion in NLD.
260              
261             This is PetaMem release. Lingua::NLD::Numbers converts
262             numeric values into their Dutch equivalents.
263              
264             =head1 SYNOPSIS
265              
266             use Lingua::NLD::Numbers;
267              
268             my $numbers = Lingua::NLD::Numbers->new();
269              
270             my $text = $numbers->parse( 123 );
271              
272             # prints 'een honderd, drie en twintig'
273             print $text;
274              
275             =head1 FUNCTIONS
276              
277             =over
278              
279             =item new
280              
281             =item parse
282              
283             Private
284              
285             =back
286              
287             =head1 KNOWN BUGS
288              
289             None, but that does not mean there are not any.
290              
291             =head1 AUTHOR
292              
293             Alistair Francis,
294              
295             Maintenance
296             PetaMem s.r.o.,
297              
298             =head1 LICENSE
299              
300             Perl 5 license.
301              
302             Original license is not known. PetaMem added
303             Perl 5 license as default.
304              
305             =cut