File Coverage

blib/lib/Lingua/SPA/Word2Num.pm
Criterion Covered Total %
statement 17 17 100.0
branch n/a
condition 2 2 100.0
subroutine 7 7 100.0
pod 2 2 100.0
total 28 28 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::SPA::Word2Num;
4             # ABSTRACT: Word 2 number conversion in SPA.
5              
6             # {{{ use block
7              
8 1     1   128410 use 5.16.0;
  1         5  
9 1     1   6 use utf8;
  1         2  
  1         13  
10              
11 1     1   1347 use Parse::RecDescent;
  1         51796  
  1         11  
12 1     1   806 use Export::Attrs;
  1         11747  
  1         8  
13              
14             # }}}
15             # {{{ var block
16             our $VERSION = '0.2603230';
17             my $parser = spa_numerals();
18              
19             # }}}
20              
21             # {{{ w2n convert number to text
22              
23             sub w2n :Export {
24 4   100 4 1 358828 my $input = shift // return;
25              
26 3         33 return $parser->numeral($input);
27 1     1   184 }
  1         3  
  1         8  
28             # }}}
29             # {{{ spa_numerals create parser for numerals
30              
31             sub spa_numerals {
32 1     1 1 9 return Parse::RecDescent->new(q{
33            
34            
35              
36             numeral: mega
37             | kOhOd
38             | 'cero' { 0 }
39             | { }
40              
41             number: 'un' { 1 }
42             | 'dos' { 2 }
43             | 'tres' { 3 }
44             | 'cuatro' { 4 }
45             | 'cinco' { 5 }
46             | 'seis' { 6 }
47             | 'siete' { 7 }
48             | 'ocho' { 8 }
49             | 'nueve' { 9 }
50             | 'diez' { 10 }
51             | 'once' { 11 }
52             | 'doce' { 12 }
53             | 'trece' { 13 }
54             | 'catorce' { 14 }
55             | 'quince' { 15 }
56             | 'dieciséis' { 16 }
57             | 'diecisiete' { 17 }
58             | 'dieciocho' { 18 }
59             | 'diecinueve' { 19 }
60             | 'veinte' { 20 }
61             | 'veintiun' { 21 }
62             | 'veintidós' { 22 }
63             | 'veintitrés' { 23 }
64             | 'veinticuatro' { 24 }
65             | 'veinticinco' { 25 }
66             | 'veintiséis' { 26 }
67             | 'veintisiete' { 27 }
68             | 'veintiocho' { 28 }
69             | 'veintinueve' { 29 }
70              
71             tens: 'treinta' { 30 }
72             | 'cuarenta' { 40 }
73             | 'cincuenta' { 50 }
74             | 'sesenta' { 60 }
75             | 'setenta' { 70 }
76             | 'ochenta' { 80 }
77             | 'noventa' { 90 }
78              
79             hundreds: 'quinientos' { 500 }
80             | 'setecientos' { 700 }
81             | 'novecientos' { 900 }
82             | number /cientos?/ { $item[1] * 100 }
83             | /cien(to)?/ { 100 }
84              
85             deca: tens 'y' number { $item[1] + $item[3] }
86             | tens
87             | number
88              
89             hecto: hundreds deca { $item[1] + $item[2] }
90             | hundreds
91              
92             hOd: hecto
93             | deca
94              
95             kilo: hOd milnotmeg hOd { $item[1] * 1000 + $item[3] }
96             | hOd milnotmeg { $item[1] * 1000 }
97             | milnotmeg hOd { 1000 + $item[2] }
98             | milnotmeg { 1000 }
99              
100             milnotmeg: ...!'mill' 'mil'
101              
102             kOhOd: kilo
103             | hOd
104              
105             mega: hOd /mill(ones|ón)/ kOhOd { $item[1] * 1_000_000 + $item[3] }
106             | hOd /mill(ones|ón)/ { $item[1] * 1_000_000 }
107             });
108             }
109              
110             # }}}
111              
112             1;
113              
114             __END__