File Coverage

blib/lib/Lingua/JPN/Number.pm
Criterion Covered Total %
statement 41 43 95.3
branch 9 12 75.0
condition 9 15 60.0
subroutine 7 7 100.0
pod 0 2 0.0
total 66 79 83.5


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