File Coverage

blib/lib/Lingua/POR/Words2Nums.pm
Criterion Covered Total %
statement 40 49 81.6
branch 7 10 70.0
condition 5 5 100.0
subroutine 7 7 100.0
pod 1 1 100.0
total 60 72 83.3


line stmt bran cond sub pod time code
1             # For Emacs: -*- mode:cperl; mode:folding; coding:utf-8; -*-
2              
3             package Lingua::POR::Words2Nums;
4             # ABSTRACT: Word 2 number conversion in POR.
5              
6             # {{{ use block
7              
8 1     1   36139 use 5.10.1;
  1         5  
  1         52  
9              
10 1     1   6 use strict;
  1         2  
  1         43  
11 1     1   6 use warnings;
  1         7  
  1         34  
12              
13 1     1   1113 use Perl6::Export::Attrs;
  1         12931  
  1         7  
14              
15             # }}}
16             # {{{ variables declaration
17              
18             our $VERSION = 0.0682;
19              
20             my (%values,@values,%bigvalues,@bigvalues);
21              
22             BEGIN {
23 1     1   261 %values = (
24             mil => 1000,
25              
26             novecentos => 900,
27             oitocentos => 800,
28             setecentos => 700,
29             seiscentos => 600,
30             quinhentos => 500,
31             quatrocentos => 400,
32             trezentos => 300,
33             duzentos => 200,
34             cem => 100,
35              
36             cento => 100,
37              
38             noventa => 90,
39             oitenta => 80,
40             setenta => 70,
41             sessenta => 60,
42             cinquenta => 50,
43             quarenta => 40,
44             trinta => 30,
45             vinte => 20,
46              
47             dezanove => 19,
48             dezoito => 18,
49             dezassete => 17,
50             dezasseis => 16,
51             quinze => 15,
52             catorze => 14,
53             treze => 13,
54             doze => 12,
55             onze => 11,
56             dez => 10,
57              
58             nove => 9,
59             oito => 8,
60             sete => 7,
61             seis => 6,
62             cinco => 5,
63             quatro => 4,
64             'três' => 3,
65             dois => 2,
66             um => 1,
67             zero => 0,
68             );
69              
70 1         20 @values = sort {$values{$b} <=> $values{$a}} keys %values;
  160         176  
71              
72 1         6 %bigvalues = (
73             bili => 1000000000000,
74             milh => 1000000,
75             );
76              
77 1         4 @bigvalues = sort {$bigvalues{$b} <=> $bigvalues{$a}} keys %bigvalues;
  1         518  
78              
79             }
80              
81             # }}}
82              
83             # {{{ word2num
84              
85             sub word2num :Export {
86 5   100 5 1 1296 $_ = shift // return;
87 4         6 my $task = $_;
88 4         6 my $result = 0;
89              
90 4         5 for my $val (@bigvalues) {
91 8         16 my $expr = "${val}ões|${val}ão";
92 8 50       212 if (s/(.+)mil(?=.*(?:$expr))//) {
93 0         0 my $big = $1;
94 0         0 for my $value (@values) {
95 0         0 $big =~ s/$value/
96 0         0 $result += ($values{$value} * $bigvalues{$val} * 1000)/e;
97             }
98             }
99 8 50       169 if (s/(.+)(?:$expr)//) {
100 0         0 my $sma = $1;
101 0         0 for my $value (@values) {
102 0         0 $sma =~ s/$value/
103 0         0 $result += ($values{$value} * $bigvalues{$val})/e;
104             }
105             }
106             }
107              
108 4 100       19 if (s/(.+?)mil//) {
109 2         4 my $thousands = $1;
110 2 50       7 if ($thousands =~ /^\s*e?\s*$/) {
111 0         0 $result += 1000;
112             }
113             else {
114 2         4 for my $value (@values) {
115 78         421 $thousands =~ s/$value/$result += ($values{$value} * 1000)/e;
  2         8  
116             }
117             }
118             }
119              
120 4         8 for my $value (@values) {
121 156         814 s/$value/$result += $values{$value}/e;
  6         21  
122             }
123              
124 4 100 100     593 if ($result == 0 && $task !~ m{\Azero\z}xms ) {
125 1         1 $result = undef;
126             }
127              
128 4         9 return $result;
129 1     1   12 }
  1         2  
  1         6  
130              
131             # }}}
132              
133             1;
134              
135             __END__