File Coverage

blib/lib/Lingua/SWE/Num2Word.pm
Criterion Covered Total %
statement 36 45 80.0
branch 11 24 45.8
condition 3 5 60.0
subroutine 7 7 100.0
pod 1 1 100.0
total 58 82 70.7


line stmt bran cond sub pod time code
1             # For Emacs: -*- mode:cperl; mode:folding; -*-
2              
3             package Lingua::SWE::Num2Word;
4             # ABSTRACT: Number 2 word conversion in SWE.
5              
6             # {{{ use block
7              
8 1     1   20956 use 5.10.1;
  1         3  
  1         37  
9              
10 1     1   4 use strict;
  1         2  
  1         33  
11 1     1   4 use warnings;
  1         5  
  1         23  
12              
13 1     1   821 use Perl6::Export::Attrs;
  1         9714  
  1         7  
14 1     1   323656 use encoding 'utf8';
  1         31184  
  1         8  
15              
16             # }}}
17             # {{{ variables declaration
18              
19             our $VERSION = 0.0682;
20              
21             # }}}
22             # {{{ num2sv_cardinal convert number to text
23              
24             sub num2sv_cardinal :Export {
25 8   100 8 1 1781 my $positive = shift // return 'noll';
26              
27 7 50       18 return if ($positive < 0);
28              
29 7         7 my $out;
30 7         30 my @tokens1 = qw(noll ett två tre fyra fem sex sju åtta nio tio elva
31             tolv tretton fjorton femton sexton sjutton arton nitton); # 0-19 Cardinals
32 7         17 my @tokens2 = qw(tjugo trettio fyrtio femtio sextio sjutio åttio nittio); # 20-90 Cardinals (end with zero)
33              
34 7 100       19 return $tokens1[$positive] if($positive < 20); # interval 0 - 19
35              
36 5 50       16 if($positive < 100) { # interval 20 - 99
    100          
    50          
    0          
37 0         0 my @num = split '',$positive;
38              
39 0         0 $out = $tokens2[$num[0]-2];
40 0 0       0 $out .= $tokens1[$num[1]] if ($num[1]);
41             } elsif($positive < 1000) { # interval 100 - 999
42 3         8 my @num = split '',$positive;
43              
44 3         7 $out = $tokens1[$num[0]].'hundra';
45              
46 3 50 33     10 if ((int $num[1].$num[2]) < 20 && (int $num[1].$num[2])>0 ) {
47 0         0 $out .= &num2sv_cardinal(int $num[1].$num[2]);
48             } else {
49 3 50       17 $out .= $tokens2[$num[1]-2] if($num[1]);
50 3 50       10 $out .= $tokens1[$num[2]] if($num[2]);
51             }
52             } elsif($positive < 1000_000) { # interval 1000 - 999_999
53 2         9 my @num = split '',$positive;
54 2         6 my @sub = splice @num,-3;
55              
56 2         15 $out = &num2sv_cardinal(int join '',@num);
57 2         4 $out .= 'tusen';
58 2 50       10 $out .= &num2sv_cardinal(int join '',@sub) if (int(join "",@sub) >0);
59             } elsif($positive < 1_000_000_000) { # interval 1_000_000 - 999_999_999
60 0         0 my @num = split '',$positive;
61 0         0 my @sub = splice @num,-6;
62              
63 0         0 $out = &num2sv_cardinal(int join '',@num);
64 0         0 $out .= ' miljoner ';
65 0 0       0 $out .= &num2sv_cardinal(int join '',@sub) if (int(join "",@sub) >0);
66             }
67              
68 5         17 return $out;
69 1     1   1354 }
  1         2  
  1         9  
70              
71             # }}}
72              
73             1;
74              
75             __END__