File Coverage

blib/lib/Convert/Number/Digits.pm
Criterion Covered Total %
statement 47 51 92.1
branch 16 22 72.7
condition 11 16 68.7
subroutine 11 11 100.0
pod 2 4 50.0
total 87 104 83.6


line stmt bran cond sub pod time code
1             package Convert::Number::Digits;
2              
3 1     1   275590 use utf8;
  1         3  
  1         9  
4             binmode(STDERR, ":utf8");
5             binmode(STDOUT, ":utf8");
6              
7             BEGIN
8             {
9 1     1   77 use strict;
  1         2  
  1         40  
10 1     1   6 use warnings;
  1         2  
  1         70  
11 1     1   9 use vars qw( %Digits $VERSION );
  1         3  
  1         292  
12              
13 1     1   3 $VERSION = "0.06";
14              
15 1         857 %Digits =(
16             toWestern => "0-9",
17             toArabic => "\x{0660}-\x{0669}",
18             toArabicIndic => "\x{06F0}-\x{06F9}",
19             toDevanagari => "\x{0966}-\x{096F}",
20             toBengali => "\x{09E6}-\x{09EF}",
21             toGurmukhi => "\x{0A66}-\x{0A6F}",
22             toGujarati => "\x{0AE6}-\x{0AEF}",
23             toOriya => "\x{0B66}-\x{0B6F}",
24             toTamil => "0\x{0BE7}-\x{0BEF}",
25             toTelugu => "\x{0C66}-\x{0C6F}",
26             toKannada => "\x{0CE6}-\x{0CEF}",
27             toMalayalam => "\x{0D66}-\x{0D6F}",
28             toThai => "\x{0E50}-\x{0E59}",
29             toLao => "\x{0ED0}-\x{0ED9}",
30             toTibetan => "\x{0F20}-\x{0F29}",
31             toMyanmar => "\x{1040}-\x{1049}",
32             toEthiopic => "0\x{1369}-\x{1371}",
33             toKhmer => "\x{17E0}-\x{17E9}",
34             toMongolian => "\x{1810}-\x{1819}",
35             toLimbu => "\x{1946}-\x{194F}",
36             toRomanUpper => "0\x{2160}-\x{2168}",
37             toRomanLower => "0\x{2170}-\x{2178}",
38             toFullWidth => "\x{FF10}-\x{FF19}",
39             toOsmanya => "\x{104A0}-\x{104A9}",
40             toBold => "\x{1D7CE}-\x{1D7D7}",
41             toDoubleStruck => "\x{1D7D8}-\x{1D7E1}",
42             toSansSerif => "\x{1D7E2}-\x{1D7EB}",
43             toSansSerifBold => "\x{1D7EC}-\x{1D7F5}",
44             toMonoSpace => "\x{1D7F6}-\x{1D7FF}"
45             );
46              
47             }
48              
49              
50             sub _setArgs
51             {
52 280     280   730 my ($self, $number) = @_;
53              
54 280 50       983 if ( $#_ > 1 ) {
55 0         0 warn ( "too many arguments." );
56 0         0 return;
57             }
58 280 50 100     2684 unless ( $number =~ /^\d+$/ || ($number =~ /[$Digits{toRomanUpper}]/) || ($number =~ /[$Digits{toRomanLower}]/) || ($number =~ /[$Digits{toEthiopic}]/) ) {
      100        
      66        
59 0         0 warn ( "$number is not a digit." );
60 0         0 return;
61             }
62              
63 280         831 $self->{number} = $number;
64              
65 280         776 1;
66             }
67              
68              
69             sub new
70             {
71 1     1 0 1155 my $class = shift;
72 1         3 my $self = {};
73              
74 1         2 my $blessing = bless ( $self, $class );
75              
76 1         7 $self->{number} = undef;
77              
78 1 50 0     4 $self->_setArgs ( @_ ) || return if ( @_ );
79              
80 1         5 $blessing;
81             }
82              
83              
84             sub number
85             {
86 560     560 0 1021 my $self = shift;
87              
88 560 100 50     1495 $self->_setArgs ( @_ ) || return
89             if ( @_ );
90              
91 560         1250 $self->{number};
92             }
93              
94              
95             sub convert
96             {
97 280     280 1 237889 my $self = shift;
98              
99             #
100             # reset string if we've been passed one:
101             #
102 280 50       5268 $self->number ( @_ ) if ( @_ );
103              
104 280         658 my $number = $self->number;
105 280 100       1194 return $number if ( $number =~ /^[0-9]+$/ );
106              
107 276         524 my $method = "toWestern";
108 276         1860 foreach my $script (keys %Digits) {
109 8004 100       36334 next if ( $script eq $method );
110 7728         433359 eval "\$number =~ tr/$Digits{$script}/$Digits{$method}/";
111             }
112              
113 276         1757 $number;
114             }
115              
116              
117             sub toMethods
118             {
119 1     1 1 24 sort keys %Digits;
120             }
121              
122              
123             sub AUTOLOAD
124             {
125 281     281   237569 my ($self, $number) = @_;
126              
127              
128 281         2641 my ($method) = ( $AUTOLOAD =~ /::([^:]+)$/ );
129 281 100 66     1983 return unless ( $method && ($method ne "DESTROY") );
130              
131 280 50       871 return unless ( $Digits{$method} );
132              
133 280 50       781 $number = $self->{number} unless ( defined($number) );
134              
135 280         1957 foreach my $script (keys %Digits) {
136 8120 100       18774 next if ( $script eq $method );
137 7840         426487 eval "\$number =~ tr/$Digits{$script}/$Digits{$method}/";
138             }
139              
140 280         1764 $number;
141             }
142              
143              
144             #########################################################
145             # Do not change this, Do not put anything below this.
146             # File must return "true" value at termination
147             1;
148             ##########################################################
149              
150              
151             __END__