File Coverage

blib/lib/Lingua/SWE/Num2Word.pm
Criterion Covered Total %
statement 35 44 79.5
branch 11 24 45.8
condition 3 5 60.0
subroutine 7 7 100.0
pod 1 1 100.0
total 57 81 70.3


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