File Coverage

blib/lib/Lingua/FAS/Word2Num.pm
Criterion Covered Total %
statement 20 20 100.0
branch n/a
condition 2 2 100.0
subroutine 8 8 100.0
pod 2 2 100.0
total 32 32 100.0


line stmt bran cond sub pod time code
1             # For Emacs: -*- mode:cperl; eval: (folding-mode 1); coding:utf-8 -*-
2             package Lingua::FAS::Word2Num;
3             # ABSTRACT: Word to number conversion in Persian
4              
5 1     1   94316 use 5.16.0;
  1         4  
6 1     1   4 use utf8;
  1         1  
  1         11  
7 1     1   21 use warnings;
  1         2  
  1         81  
8              
9             # {{{ use block
10              
11 1     1   529 use Export::Attrs;
  1         8989  
  1         8  
12 1     1   1334 use Parse::RecDescent;
  1         35955  
  1         8  
13              
14             # }}}
15             # {{{ var block
16             our $VERSION = '0.2603300';
17             my $parser = fas_numerals();
18              
19             # }}}
20              
21             # {{{ w2n convert text to number
22              
23             sub w2n :Export {
24 2   100 2 1 215162 my $input = shift // return;
25              
26 1         22 return $parser->numeral($input);
27 1     1   120 }
  1         2  
  1         13  
28              
29             # }}}
30             # {{{ fas_numerals create parser for persian numerals
31              
32             sub fas_numerals {
33 1     1 1 6 return Parse::RecDescent->new(q{
34            
35              
36             numeral: mega
37             | kOhOd
38             | { }
39              
40             number: "صفر" { 0 }
41             | "یک" { 1 }
42             | "دو" { 2 }
43             | "سه" { 3 }
44             | "چهار" { 4 }
45             | "پنج" { 5 }
46             | "شش" { 6 }
47             | "هفت" { 7 }
48             | "هشت" { 8 }
49             | "نه" { 9 }
50              
51             teens: "ده" { 10 }
52             | "یازده" { 11 }
53             | "دوازده" { 12 }
54             | "سیزده" { 13 }
55             | "چهارده" { 14 }
56             | "پانزده" { 15 }
57             | "شانزده" { 16 }
58             | "هفده" { 17 }
59             | "هجده" { 18 }
60             | "نوزده" { 19 }
61              
62             tens: "بیست" { 20 }
63             | "سی" { 30 }
64             | "چهل" { 40 }
65             | "پنجاه" { 50 }
66             | "شصت" { 60 }
67             | "هفتاد" { 70 }
68             | "هشتاد" { 80 }
69             | "نود" { 90 }
70              
71             deca: teens
72             | tens "و" number { $item[1] + $item[3] }
73             | tens
74             | number
75              
76             hundreds: "نهصد" { 900 }
77             | "هشتصد" { 800 }
78             | "هفتصد" { 700 }
79             | "ششصد" { 600 }
80             | "پانصد" { 500 }
81             | "چهارصد" { 400 }
82             | "سیصد" { 300 }
83             | "دویست" { 200 }
84             | "صد" { 100 }
85              
86             hecto: hundreds "و" deca { $item[1] + $item[3] }
87             | hundreds
88              
89             hOd: hecto
90             | deca
91              
92             kilo: hOd "هزار" "و" hOd { $item[1] * 1000 + $item[4] }
93             | hOd "هزار" { $item[1] * 1000 }
94             | "هزار" "و" hOd { 1000 + $item[3] }
95             | "هزار" { 1000 }
96              
97             kOhOd: kilo
98             | hOd
99              
100             mega: hOd "میلیون" "و" kOhOd { $item[1] * 1_000_000 + $item[4] }
101             | hOd "میلیون" { $item[1] * 1_000_000 }
102             });
103             }
104              
105             # }}}
106              
107             1;
108              
109             __END__