File Coverage

blib/lib/Lingua/PT/Words2Nums.pm
Criterion Covered Total %
statement 39 39 100.0
branch 8 8 100.0
condition 1 2 50.0
subroutine 5 5 100.0
pod 1 1 100.0
total 54 55 98.1


line stmt bran cond sub pod time code
1             package Lingua::PT::Words2Nums;
2            
3 4     4   216926 use 5.006;
  4         34  
4 4     4   21 use strict;
  4         7  
  4         118  
5 4     4   32 use warnings;
  4         7  
  4         1295  
6            
7             require Exporter;
8            
9             our @ISA = qw(Exporter);
10            
11             our %EXPORT_TAGS = ( 'all' => [ qw(
12             word2num
13             ) ] );
14            
15             our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
16            
17             our @EXPORT = qw(
18             );
19            
20             our $VERSION = '1.05';
21            
22             =encoding latin1
23            
24             =head1 NAME
25            
26             Lingua::PT::Words2Nums - Converts Portuguese words to numbers
27            
28             =head1 SYNOPSIS
29            
30             use Lingua::PT::Words2Nums qw/word2num/;
31            
32             $result = num2word("cinco");
33             # $result now holds 5
34            
35             =head1 DESCRIPTION
36            
37             C converts Portuguese words to numbers (works with numbers
38             ranging from 0 to 999.999.999.999.999.999).
39            
40             Not all possible ways to write a number have been implemented (some
41             people write "nove mil novecentos e um", some people write "nove mil,
42             novecentos e um"; C currently supports only the first way,
43             without commas; also, the word "bilião" is supported, but not "bilhão").
44            
45             =cut
46            
47             my (%values,@values,%bigvalues,@bigvalues);
48            
49             BEGIN {
50 4     4   109 %values = (
51             mil => 1000,
52            
53             novecentos => 900,
54             oitocentos => 800,
55             setecentos => 700,
56             seiscentos => 600,
57             quinhentos => 500,
58             quatrocentos => 400,
59             trezentos => 300,
60             duzentos => 200,
61             cem => 100,
62            
63             cento => 100,
64            
65             noventa => 90,
66             oitenta => 80,
67             setenta => 70,
68             sessenta => 60,
69             cinquenta => 50,
70             quarenta => 40,
71             trinta => 30,
72             vinte => 20,
73            
74             dezanove => 19,
75             dezoito => 18,
76             dezassete => 17,
77             dezasseis => 16,
78             quinze => 15,
79             catorze => 14,
80             treze => 13,
81             doze => 12,
82             onze => 11,
83             dez => 10,
84            
85             nove => 9,
86             oito => 8,
87             sete => 7,
88             seis => 6,
89             cinco => 5,
90             quatro => 4,
91             'três' => 3,
92             dois => 2,
93             um => 1,
94             );
95            
96 4         96 @values = sort {$values{$b} <=> $values{$a}} keys %values;
  624         904  
97            
98 4         34 %bigvalues = (
99             bili => 1000000000000,
100             milh => 1000000,
101             );
102            
103 4         17 @bigvalues = sort {$bigvalues{$b} <=> $bigvalues{$a}} keys %bigvalues;
  4         1453  
104            
105             }
106            
107             =head2 word2num
108            
109             Turns a word into a number
110            
111             $result = num2word("cinco");
112             # $result now holds 5
113            
114             =cut
115            
116             sub word2num {
117 10209   50 10209 1 35917 $_ = shift || return undef;
118 10209         14506 my $result = 0;
119            
120 10209         17662 for my $val (@bigvalues) {
121 20418         39707 my $expr = "${val}ões|${val}ão";
122            
123 20418 100       444607 if (s/(.+)mil(?=.*(?:$expr))//) {
124 49         161 my $big = $1;
125 49         115 for my $value (@values) {
126 1862         11673 $big =~ s/$value/
127 97         411 $result += ($values{$value} * $bigvalues{$val} * 1000)/e;
128             }
129             }
130            
131 20418 100       299930 if (s/(.+)(?:$expr)//) {
132 108         319 my $sma = $1;
133 108         221 for my $value (@values) {
134 4104         25614 $sma =~ s/$value/
135 194         838 $result += ($values{$value} * $bigvalues{$val})/e;
136             }
137             }
138            
139             }
140            
141 10209 100       47766 if (s/(.+?)mil//) {
142 8117         18063 my $thousands = $1;
143 8117 100       27982 if ($thousands =~ /^\s*e?\s*$/) {
144 2         5 $result += 1000;
145             }
146             else {
147 8115         13814 for my $value (@values) {
148 308370         1519806 $thousands =~ s/$value/$result += ($values{$value} * 1000)/e;
  8211         30235  
149             }
150             }
151             }
152            
153 10209         18127 for my $value (@values) {
154 387942         1952552 s/$value/$result += $values{$value}/e;
  27423         81786  
155             }
156            
157 10209         58004 $result;
158             }
159            
160             1;
161             __END__