File Coverage

blib/lib/Lingua/HYE/Num2Word.pm
Criterion Covered Total %
statement 46 47 97.8
branch 28 30 93.3
condition 18 27 66.6
subroutine 9 10 90.0
pod 2 2 100.0
total 103 116 88.7


line stmt bran cond sub pod time code
1             # For Emacs: -*- mode:cperl; eval: (folding-mode 1); coding:utf-8 -*-
2              
3             package Lingua::HYE::Num2Word;
4             # ABSTRACT: Number to word conversion in Armenian
5              
6 1     1   136948 use 5.16.0;
  1         4  
7 1     1   6 use utf8;
  1         3  
  1         18  
8 1     1   34 use warnings;
  1         4  
  1         75  
9              
10             # {{{ use block
11              
12 1     1   8 use Carp;
  1         2  
  1         97  
13 1     1   716 use Export::Attrs;
  1         12895  
  1         10  
14 1     1   929 use Readonly;
  1         5269  
  1         348  
15              
16             # }}}
17             # {{{ variable declarations
18              
19             my Readonly::Scalar $COPY = 'Copyright (c) PetaMem, s.r.o. 2002-present';
20             our $VERSION = '0.2603300';
21              
22             my @ONES = ('զրո', 'մեկ', 'երկու', 'երեք', 'չորս',
23             'հինգ', 'վեց', 'յոթ', 'ութ', 'ինը');
24              
25             my @TEENS = ('տասնմեկ', 'տասներկու', 'տասներեք',
26             'տասնչորս', 'տասնհինգ', 'տասնվեց',
27             'տասնյոթ', 'տասնութ', 'տասնինը');
28              
29             my @TENS = ('', 'տաս', 'քսան', 'երեսուն', 'քառասուն',
30             'հիսուն', 'վաթսուն', 'յոթանասուն', 'ութսուն', 'իննսուն');
31              
32             my $HUNDRED = 'հարյուր';
33             my $THOUSAND = 'հազար';
34             my $MILLION = 'միլիոն';
35              
36             # }}}
37              
38             # {{{ num2hye_cardinal convert number to text
39              
40             sub num2hye_cardinal :Export {
41 19     19 1 251293 my $positive = shift;
42              
43 19 100 66     290 croak 'You should specify a number from interval [0, 999_999_999]'
      66        
      100        
44             if !defined $positive
45             || $positive !~ m{\A\d+\z}xms
46             || $positive < 0
47             || $positive > 999_999_999;
48              
49 17         52 return _convert($positive);
50 1     1   11 }
  1         2  
  1         11  
51              
52             # }}}
53             # {{{ _convert internal recursive conversion
54              
55             sub _convert {
56 23     23   46 my $n = shift;
57              
58 23 100 66     1409 return $ONES[$n] if $n >= 0 && $n <= 9;
59 17 100       41 return $TENS[1] if $n == 10;
60 16 100 66     68 return $TEENS[$n - 11] if $n >= 11 && $n <= 19;
61              
62 14         28 my $out;
63              
64 14 100 66     116 if ($n >= 20 && $n <= 99) {
    100 66        
    100 66        
    50 33        
65 5         49 my $ten_idx = int($n / 10);
66 5         26 my $remain = $n % 10;
67 5         13 $out = $TENS[$ten_idx];
68 5 100       23 $out .= " $ONES[$remain]" if $remain;
69             }
70             elsif ($n >= 100 && $n <= 999) {
71 4         13 my $h = int($n / 100);
72 4         8 my $remain = $n % 100;
73 4 100       16 $out = $h == 1 ? $HUNDRED : "$ONES[$h] $HUNDRED";
74 4 100       24 $out .= ' ' . _convert($remain) if $remain;
75             }
76             elsif ($n >= 1000 && $n <= 999_999) {
77 3         10 my $k = int($n / 1000);
78 3         7 my $remain = $n % 1000;
79 3 100       11 $out = $k == 1 ? $THOUSAND : _convert($k) . " $THOUSAND";
80 3 100       11 $out .= ' ' . _convert($remain) if $remain;
81             }
82             elsif ($n >= 1_000_000 && $n <= 999_999_999) {
83 2         7 my $m = int($n / 1_000_000);
84 2         5 my $remain = $n % 1_000_000;
85 2 100       12 $out = $m == 1 ? "$ONES[1] $MILLION" : _convert($m) . " $MILLION";
86 2 50       7 $out .= ' ' . _convert($remain) if $remain;
87             }
88              
89 14         51 return $out;
90             }
91              
92             # }}}
93             # {{{ capabilities declare supported features
94              
95             sub capabilities {
96             return {
97 0     0 1   cardinal => 1,
98             ordinal => 0,
99             };
100             }
101              
102             # }}}
103             1;
104              
105             __END__