File Coverage

blib/lib/Parse/Number/ID.pm
Criterion Covered Total %
statement 31 31 100.0
branch 11 12 91.6
condition 2 2 100.0
subroutine 7 7 100.0
pod 1 1 100.0
total 52 53 98.1


line stmt bran cond sub pod time code
1             package Parse::Number::ID;
2              
3 1     1   692 use 5.010001;
  1         4  
  1         49  
4 1     1   6 use strict;
  1         2  
  1         33  
5 1     1   6 use warnings;
  1         1  
  1         516  
6              
7             require Exporter;
8             our @ISA = qw(Exporter);
9             our @EXPORT_OK = qw(parse_number_id $Pat);
10              
11             our $VERSION = '0.06'; # VERSION
12              
13             our %SPEC;
14              
15             our $Pat = qr/(?:
16             [+-]?
17             (?:
18             \d{1,2}(?:[.]\d{3})*(?:[,]\d*)? | # indo
19             \d{1,2}(?:[,]\d{3})*(?:[.]\d*)? | # english
20             [,.]\d+ |
21             \d+
22             )
23             (?:[Ee][+-]?\d+)?
24             )/x;
25              
26             sub _clean_nd {
27 7     7   9 my $n = shift;
28 7         18 $n =~ s/\D//;
29 7         53 $n;
30             }
31              
32             sub _parse_mantissa {
33 25     25   53 my $n = shift;
34 25 100       84 if ($n =~ /^([+-]?)([\d,.]*)\.(\d{0,2})$/) {
35 7 100 100     35 return (_clean_nd($2 || 0) + "0.$3")*
36             ($1 eq '-' ? -1 : 1);
37             } else {
38 18         27 $n =~ s/\.//g;
39 18         26 $n =~ s/,/./g;
40 1     1   7 no warnings;
  1         1  
  1         326  
41 18         55 return $n+0;
42             }
43             }
44              
45             $SPEC{parse_number_id} = {
46             v => 1.1,
47             summary => 'Parse number from Indonesian text',
48             args => {
49             text => {
50             summary => 'The input text that contains number',
51             schema => 'str*',
52             pos => 0,
53             req => 1,
54             },
55             },
56             result_naked => 1,
57             };
58             sub parse_number_id {
59 30     30 1 55572 my %args = @_;
60 30         47 my $text = $args{text};
61              
62 30         115 $text =~ s/^\s+//s;
63 30 100       74 return undef unless length($text);
64              
65 29 100       124 $text =~ s/^([+-]?[0-9,.]+)// or return undef;
66 25         44 my $n = _parse_mantissa($1);
67 25 50       51 return undef unless defined $n;
68 25 100       58 if ($text =~ /[Ee]([+-]?\d+)/) {
69 7         26 $n *= 10**$1;
70             }
71 25         58 $n;
72             }
73              
74             1;
75             # ABSTRACT: Parse number from Indonesian text
76              
77             __END__