File Coverage

blib/lib/Lingua/CES/Num2Word.pm
Criterion Covered Total %
statement 52 58 89.6
branch 27 36 75.0
condition 13 27 48.1
subroutine 7 7 100.0
pod 1 1 100.0
total 100 129 77.5


line stmt bran cond sub pod time code
1             # For Emacs: -*- mode:cperl; mode:folding; coding:utf-8; -*-
2              
3             package Lingua::CES::Num2Word;
4             # ABSTRACT: Number 2 word conversion in CES.
5              
6             # {{{ use block
7              
8 1     1   136008 use v5.32;
  1         5  
9 1     1   6 use warnings;
  1         2  
  1         66  
10 1     1   5 use utf8;
  1         3  
  1         7  
11              
12 1     1   28 use Carp;
  1         3  
  1         120  
13 1     1   649 use Export::Attrs;
  1         13893  
  1         8  
14              
15             # }}}
16             # {{{ var block
17             our $VERSION = '0.2603230';
18             my %token1 = qw( 0 nula 1 jedna 2 dva
19             3 tři 4 čtyři 5 pět
20             6 šest 7 sedm 8 osm
21             9 devět 10 deset 11 jedenáct
22             12 dvanáct 13 třináct 14 čtrnáct
23             15 patnáct 16 šestnáct 17 sedmnáct
24             18 osmnáct 19 devatenáct
25             );
26             my %token2 = qw( 20 dvacet 30 třicet 40 čtyřicet
27             50 padesát 60 šedesát 70 sedmdesát
28             80 osmdesát 90 devadesát
29             );
30             my %token3 = ( 100, 'sto', 200, 'dvě stě', 300, 'tři sta',
31             400, 'čtyři sta', 500, 'pět set', 600, 'šest set',
32             700, 'sedm set', 800, 'osm set', 900, 'devět set'
33             );
34              
35             # }}}
36              
37             # {{{ num2ces_cardinal number to string conversion
38              
39             sub num2ces_cardinal :Export {
40 34     34 1 281163 my $result = '';
41 34         62 my $number = shift;
42              
43 34 100 33     449 croak 'You should specify a number from interval [0, 999_999_999]'
      33        
      66        
44             if !defined $number
45             || $number !~ m{\A\d+\z}xms
46             || $number < 0
47             || $number > 999_999_999;
48              
49 33         57 my $reminder = 0;
50              
51 33 100       129 if ($number < 20) {
    100          
    100          
    100          
    50          
52 13         70 $result = $token1{$number};
53             }
54             elsif ($number < 100) {
55 8         16 $reminder = $number % 10;
56 8 100       21 if ($reminder == 0) {
57 1         5 $result = $token2{$number};
58             }
59             else {
60 7         61 $result = $token2{$number - $reminder}.' '.num2ces_cardinal($reminder);
61             }
62             }
63             elsif ($number < 1_000) {
64 8         14 $reminder = $number % 100;
65 8 100       19 if ($reminder != 0) {
66 7         26 $result = $token3{$number - $reminder}.' '.num2ces_cardinal($reminder);
67             }
68             else {
69 1         5 $result = $token3{$number};
70             }
71             }
72             elsif ($number < 1_000_000) {
73 2         6 $reminder = $number % 1_000;
74 2 50       8 my $tmp1 = ($reminder != 0) ? ' '.num2ces_cardinal($reminder) : '';
75 2         8 my $tmp2 = substr($number, 0, length($number)-3);
76 2         6 my $tmp3 = $tmp2 % 100;
77 2         16 my $tmp4 = $tmp2 % 10;
78              
79 2 50 33     11 if ($tmp3 < 9 || $tmp3 > 20) {
80 2 50 33     20 if ($tmp4 == 1 && $tmp2 == 1) {
    50 66        
    100          
81 0         0 $tmp2 = 'tisíc';
82             }
83             elsif ($tmp4 == 1) {
84 0         0 $tmp2 = num2ces_cardinal($tmp2 - $tmp4).' jeden tisíc';
85             }
86             elsif($tmp4 > 1 && $tmp4 < 5) {
87 1         4 $tmp2 = num2ces_cardinal($tmp2).' tisíce';
88             }
89             else {
90 1         4 $tmp2 = num2ces_cardinal($tmp2).' tisíc';
91             }
92             }
93             else {
94 0         0 $tmp2 = num2ces_cardinal($tmp2).' tisíc';
95             }
96 2         7 $result = $tmp2.$tmp1;
97             }
98             elsif ($number < 1_000_000_000) {
99 2         4 $reminder = $number % 1_000_000;
100 2 50       11 my $tmp1 = ($reminder != 0) ? ' '.num2ces_cardinal($reminder) : '';
101 2         10 my $tmp2 = substr($number, 0, length($number)-6);
102 2         5 my $tmp3 = $tmp2 % 100;
103 2         5 my $tmp4 = $tmp2 % 10;
104              
105 2 50 66     11 if ($tmp3 < 9 || $tmp3 > 20) {
106 2 50 33     16 if ($tmp4 == 1 && $tmp2 == 1) {
    50 66        
    100          
107 0         0 $tmp2 = 'milion';
108             }
109             elsif ($tmp4 == 1) {
110 0         0 $tmp2 = num2ces_cardinal($tmp2 - $tmp4).' jeden milion';
111             }
112             elsif($tmp4 > 1 && $tmp4 < 5) {
113 1         5 $tmp2 = num2ces_cardinal($tmp2).' miliony';
114             }
115             else {
116 1         3 $tmp2 = num2ces_cardinal($tmp2).' milionů';
117             }
118             }
119             else {
120 0         0 $tmp2 = num2ces_cardinal($tmp2).' milionů';
121             }
122              
123 2         8 $result = $tmp2.$tmp1;
124             }
125              
126 33         117 return $result;
127 1     1   1127 }
  1         2  
  1         8  
128              
129             # }}}
130              
131             1;
132              
133             __END__