File Coverage

blib/lib/Lingua/ITA/Word2Num.pm
Criterion Covered Total %
statement 19 19 100.0
branch n/a
condition 2 2 100.0
subroutine 7 7 100.0
pod 2 2 100.0
total 30 30 100.0


line stmt bran cond sub pod time code
1             # For Emacs: -*- mode:cperl; eval: (folding-mode 1); coding:utf-8; -*-
2              
3             package Lingua::ITA::Word2Num;
4             # ABSTRACT: Word 2 number conversion in ITA.
5              
6             # {{{ use block
7              
8 1     1   147035 use 5.16.0;
  1         27  
9 1     1   7 use utf8;
  1         2  
  1         17  
10              
11 1     1   820 use Export::Attrs;
  1         10581  
  1         6  
12 1     1   1105 use Parse::RecDescent;
  1         31483  
  1         7  
13              
14             # }}}
15             # {{{ var block
16             our $VERSION = '0.2603230';
17             our @EXPORT_OK = qw(cardinal2num w2n);
18             my $parser = ita_numerals();
19              
20             # }}}
21              
22             # {{{ w2n convert number to text
23              
24             sub w2n :Export {
25 3   100 3 1 310440 my $input = shift // return;
26              
27 2         15 $input =~ s/,//g;
28 2         16 $input =~ s/ //g;
29              
30 2         31 return $parser->numeral($input);
31 1     1   155 }
  1         2  
  1         7  
32             # }}}
33             # {{{ ita_numerals create parser for numerals
34              
35             sub ita_numerals {
36 1     1 1 4 return Parse::RecDescent->new(q{
37            
38              
39             numeral: mega
40             | kOhOd
41             | 'zero' { 0 }
42             | { }
43              
44             number:
45             'undici' { 11 }
46             | 'tredici' { 13 }
47             | 'un' { 1 }
48             | 'due' { 2 }
49             | 'tre' { 3 }
50             | 'quattro' { 4 }
51             | 'cinque' { 5 }
52             | 'sei' { 6 }
53             | 'sette' { 7 }
54             | 'otto' { 8 }
55             | 'nove' { 9 }
56             | 'dieci' { 10 }
57             | 'dodici' { 12 }
58             | 'quattordici' { 14 }
59             | 'quindici' { 15 }
60             | 'sedici' { 16 }
61             | 'diciassette' { 17 }
62             | 'diciotto' { 18 }
63             | 'diciannove' { 19 }
64              
65             tens: 'venti' { 20 }
66             | /ventuno?/ { 21 }
67             | 'ventotto' { 28 }
68             | 'trenta' { 30 }
69             | 'trent' { 30 }
70             | 'quaranta' { 40 }
71             | 'quarant' { 40 }
72             | 'cinquanta' { 50 }
73             | 'cinquant' { 50 }
74             | 'sessanta' { 60 }
75             | 'sessant' { 60 }
76             | 'settanta' { 70 }
77             | 'settant' { 70 }
78             | 'ottanta' { 80 }
79             | 'ottant' { 80 }
80             | 'novanta' { 90 }
81             | 'novant' { 90 }
82              
83             deca: tens number { $item[1] + $item[2] }
84             | tens
85             | number
86              
87             hecto: number /cento/ deca { $item[1] * 100 + $item[3] }
88             | number /cento/ { $item[1] * 100 }
89             | /cento/ deca { 100 + $item[2] }
90             | 'cento' { 100 }
91              
92             hOd: hecto
93             | deca
94              
95             kilo: hOd /mill?[ae]/ hOd { $item[1] * 1000 + $item[3] }
96             | hOd /mill?[ae]/ { $item[1] * 1000 }
97             | /mill?[ae]/ hOd { 1000 + $item[2] }
98             | /mill?[ae]/ { 1000 }
99              
100             kOhOd: kilo
101             | hOd
102              
103             mega: kOhOd /mill?ion[ei]/ kOhOd { $item[1] * 1_000_000 + $item[3] }
104              
105             });
106             }
107             # }}}
108              
109             1;
110              
111             __END__