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