File Coverage

blib/lib/Lingua/JPN/Number.pm
Criterion Covered Total %
statement 40 42 95.2
branch 9 12 75.0
condition 9 15 60.0
subroutine 7 7 100.0
pod 0 2 0.0
total 65 78 83.3


line stmt bran cond sub pod time code
1             # For Emacs: -*- mode:cperl; eval: (folding-mode 1); coding:utf-8; -*-
2             #
3             # Mike Schilli, 2001 (m@perlmeister.com)
4             #
5              
6             package Lingua::JPN::Number;
7             # ABSTRACT: Number 2 word conversion in JPN.
8              
9 2     2   11630 use 5.16.0;
  2         8  
10 2     2   1056 use utf8;
  2         623  
  2         17  
11 2     2   79 use warnings;
  2         5  
  2         154  
12              
13             # {{{ use block
14              
15 2     2   1256 use Export::Attrs;
  2         21894  
  2         16  
16              
17             # }}}
18             # {{{ variables declaration
19             our $VERSION = '0.2603250';
20              
21             my %N2J = qw(
22             1 ichi 2 ni 3 san 4 yon 5 go 6 roku 7 nana
23             8 hachi 9 kyu 10 ju 100 hyaku 1000 sen);
24              
25             my %N2J_EXCP = qw(
26             300 san-byaku 600 ro-p-pyaku 800 ha-p-pyaku
27             3000 san-zen 8000 ha-s-sen);
28              
29             my @N2J_BLOCK = ("", "man", "oku", "cho");
30              
31             my %N2J_BLOCK_EXCP = qw( 1 i-t-cho 8 ha-t-cho
32             0 ju-t-cho);
33              
34             # }}}
35              
36             # {{{ to_string
37             sub to_string :Export {
38 4     4 0 197595 my $n = shift;
39              
40 4 50 33     25 if($n < 1 || $n >= 1E16) {
41 0         0 warn "$n needs to be >=1 and <1E16.\n";
42 0         0 return;
43             }
44              
45 4         9 my @result = ();
46 4         10 $n = reverse $n;
47 4         9 my $bix = 0;
48              
49 4         26 while($n =~ /(\d{1,4})/g) {
50 8         20 my $b = scalar reverse($1);
51 8         21 my @r = blockof4_to_string($b);
52              
53 8 100 100     27 if($bix && @r) {
54 2 100 66     13 if($bix == 3 &&
55             $b =~ /[1-9]0$|[18]$/) {
56 1         5 $r[-1] = $N2J_BLOCK_EXCP{$b%10};
57             } else {
58 1         4 push @r, $N2J_BLOCK[$bix];
59             }
60             }
61 8         18 unshift @result, @r;
62 8         30 $bix++;
63             }
64              
65 4         24 return @result;
66 2     2   948 }
  2         4  
  2         26  
67              
68             # }}}
69             # {{{ blockof4_to_string
70              
71             sub blockof4_to_string {
72 8     8 0 15 my $n = shift;
73              
74 8 50 33     34 return if $n > 9999 or $n < 0;
75 8 50       20 return "" unless $n;
76              
77 8         31 my @result = ();
78 8         32 my @digits = split //, sprintf("%04d", $n);
79 8         17 my @weights = (1000, 100, 10, 1);
80              
81 8         20 for my $i (0..3) {
82 32 100       68 next unless $digits[$i];
83 9         19 my $v = $digits[$i] * $weights[$i];
84             push @result, $N2J_EXCP{$v} ||
85             $N2J{$v} ||
86             ($N2J{$digits[$i]},
87 9   66     89 $N2J{$weights[$i]});
88             }
89              
90 8         29 return @result;
91             }
92              
93             # }}}
94              
95             1;
96              
97             __END__