File Coverage

blib/lib/Lingua/TL/Numbers.pm
Criterion Covered Total %
statement 64 64 100.0
branch 51 56 91.0
condition 1 3 33.3
subroutine 10 10 100.0
pod 2 2 100.0
total 128 135 94.8


line stmt bran cond sub pod time code
1             package Lingua::TL::Numbers;
2              
3 3     3   85763 use strict;
  3         8  
  3         179  
4 3     3   17 use warnings;
  3         5  
  3         132  
5              
6 3     3   2858 use integer;
  3         41  
  3         16  
7              
8 3     3   100 use base qw(Exporter);
  3         5  
  3         3188  
9             our @EXPORT_OK = qw(num2tl num2tl_ordinal);
10              
11             our $VERSION = 0.02;
12              
13             my @CARDINAL_UNITS = (undef, qw(
14             isa dalawa tatlo apat lima anim pito walo siyam sampu labing-isa labindalawa
15             labintatlo labing-apat labinlima labing-anim labimpito labingwalo labinsiyam
16             ));
17              
18             my @CARDINAL_TENS = (undef, qw(
19             sampu dalawampu tatlumpu apatnapu limampu animnapu pitumpu walumpu siyamnapu
20             ));
21              
22              
23             sub _cardinal_thousands {
24 39     39   66 my ($number, $div, $suffix, $at) = @_;
25              
26 39         68 my $word = _cardinal($number / $div);
27 39 100       144 if ($word =~ /[aeiou]$/) { $word .= 'ng ' . $suffix }
  25 100       46  
28 4         9 elsif ($word =~ /n$/) { $word .= 'g ' . $suffix }
29 10         22 else { $word .= ' na ' . $suffix }
30 39 100       104 $word .= $at . _cardinal($number % $div) if $number % $div;
31 39         168 return $word;
32             }
33              
34             sub _cardinal {
35 279     279   303 my $number = shift;
36              
37 279 100       663 return $CARDINAL_UNITS[$number] if $number < 20;
38              
39 163 100       291 if ($number < 100) {
40 69         105 my $word = $CARDINAL_TENS[$number / 10];
41 69 100       192 $word .= "'t " . $CARDINAL_UNITS[$number % 10] if $number % 10;
42 69         213 return $word;
43             }
44 94 100       164 if ($number < 1000) {
45 55         118 my $word = _cardinal($number / 100);
46 55 100       320 $word .= $word =~ /[aeiou]$/ ? 'ng daan' : ' na raan';
47 55 100       188 $word = substr($word, 0, -1) . "'t " . _cardinal($number % 100) if $number % 100;
48 55         725 return $word;
49             }
50              
51 39 100       100 return _cardinal_thousands($number, 1_000, 'libo', "'t ") if $number < 1_000_000;
52 12 50       31 return _cardinal_thousands($number, 1_000_000, 'milyon', ' at ') if $number < 1_000_000_000;
53             }
54              
55             sub num2tl {
56 118     118 1 1378 my $number = shift;
57              
58 118 50 33     521 return if $number < 1 or $number > 999_999_999;
59            
60 118         313 return _cardinal($number);
61             }
62              
63             sub _ordinal_ika {
64 15     15   15 my $number = shift;
65              
66 15 100       27 return 'una' if 1 == $number;
67 14 100       23 return 'ikalawa' if 2 == $number;
68 13 100       26 return 'ikatlo' if 3 == $number;
69              
70 12 50       16 my $word = num2tl($number) or return;
71              
72 12         17 my $prefix = 'ika';
73 12 100       29 $prefix .= '-' if $word =~ /^[aeiou]/;
74              
75 12         24 return $prefix . $word;
76             }
77              
78             sub _ordinal_pang {
79 15     15   15 my $number = shift;
80            
81 15 100       31 return 'panguna' if 1 == $number;
82 14 100       24 return 'pangalawa' if 2 == $number;
83 13 100       23 return 'pangatlo' if 3 == $number;
84              
85 12 50       15 my $word = num2tl($number) or return;
86              
87 12         16 my $prefix = '';
88 12 100       51 if ($word =~ /^[aieou]/) { $prefix = 'pang-' }
  4 100       568  
    100          
    50          
89 1         1 elsif ($word =~ /^w/) { $prefix = 'pang' }
90 6         8 elsif ($word =~ /^[dtls]/) { $prefix = 'pan' }
91 1         2 elsif ($word =~ /^p/) { $prefix = 'pam' }
92              
93 12         26 return $prefix . $word;
94             }
95              
96             sub num2tl_ordinal {
97 30     30 1 1746 my $number = shift;
98 30         50 my %options = @_;
99              
100 30         67 my %opts = (
101             ika => 0,
102             hypen => 0,
103             );
104 30         66 foreach my $key (keys %opts) {
105 60 100       159 $opts{$key} = ! !$options{$key} if exists $options{$key};
106             }
107              
108 30 100       88 my $word = $opts{ika} ? _ordinal_ika($number)
109             : _ordinal_pang($number);
110              
111 30 100       68 $word =~ tr/ /-/ if $opts{hypen};
112              
113 30         276 return $word;
114             }
115              
116             1;
117              
118             __END__