import sql-ledger 2.4.4
[freeside.git] / sql-ledger / sql-ledger / locale / fr / Num2text
1 #=====================================================================
2 # SQL-Ledger Accounting
3 # Copyright (C) 2002
4 #
5 #  Author: Dieter Simader
6 #   Email: dsimader@sql-ledger.org
7 #     Web: http://www.sql-ledger.org
8 #
9 #  Contributors: Bruno Leveque <bruno.leveque@net6d.com>
10 #
11 # This program is free software; you can redistribute it and/or modify
12 # it under the terms of the GNU General Public License as published by
13 # the Free Software Foundation; either version 2 of the License, or
14 # (at your option) any later version.
15 #
16 # This program is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 # GNU General Public License for more details.
20 # You should have received a copy of the GNU General Public License
21 # along with this program; if not, write to the Free Software
22 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #=====================================================================
24 #
25 # this is the french code for printing numbers in text
26 #
27 #=====================================================================
28
29
30 sub init {
31   my $self = shift;
32
33   %{ $self->{numbername} } =
34                    (0 => 'Zero',
35                     1 => 'Un',
36                     2 => 'Deux',
37                     3 => 'Trois',
38                     4 => 'Quatre',
39                     5 => 'Cinq',
40                     6 => 'Six',
41                     7 => 'Sept',
42                     8 => 'Huit',
43                     9 => 'Neuf',
44                    10 => 'Dix',
45                    11 => 'Onze',
46                    12 => 'Douze',
47                    13 => 'Treize',
48                    14 => 'Quatorze',
49                    15 => 'Quinze',
50                    16 => 'Seize',
51                    17 => 'Dix-sept',
52                    18 => 'Dix-huit',
53                    19 => 'Dix-neuf',
54                    20 => 'Vingt',
55                    30 => 'Trente',
56                    40 => 'Quarante',
57                    50 => 'Cinquante',
58                    60 => 'Soixante',
59                    70 => 'Soixante-dix',
60                    80 => 'Quatre-vingt',
61                    90 => 'Quatre-vingt-dix',
62                 10**2 => 'Cent',
63                 10**3 => 'Mille',
64                 10**6 => 'Million',
65                 10**9 => 'Milliard',
66                10**12 => 'Billion',
67                 );
68
69 }
70
71
72 sub num2text {
73   my ($self, $amount) = @_;
74
75   return $self->{numbername}{0} unless $amount;
76
77   my @textnumber = ();
78
79   # split amount into chunks of 3
80   my @num = reverse split //, abs($amount);
81   my @numblock = ();
82   my @a;
83   my $i;
84
85   while (@num) {
86     @a = ();
87     for (1 .. 3) {
88       push @a, shift @num;
89     }
90     push @numblock, join / /, reverse @a;
91   }
92     
93   my $cent=0;
94
95   while (@numblock) {
96
97     $i = $#numblock;
98     @num = split //, $numblock[$i];
99     
100     if ($numblock[$i] == 0) {
101       pop @numblock;
102       next;
103     }
104    
105     if ($numblock[$i] > 99) {
106       $cent=1;
107
108       # the one from hundreds
109
110       if ($num[0] > 1) {
111         push @textnumber, $self->{numbername}{$num[0]};
112       }
113      
114       # reduce numblock
115       $numblock[$i] -= $num[0] * 100;
116
117       # add hundred designation
118       if ($num[0] > 1) {
119         if($numblock[$i] > 0) {
120             push @textnumber, $self->{numbername}{10**2};
121         } else {
122           push @textnumber, "$self->{numbername}{10**2}s";
123         }
124       } else {
125         push @textnumber, $self->{numbername}{10**2};
126       }
127       
128     }
129     
130     $numblock[$i] *= 1;
131     
132     if ($numblock[$i] > 9) {
133       # tens
134       push @textnumber, $self->format_ten($numblock[$i]);
135     } elsif ($numblock[$i] > 0) {
136       # ones
137       if ($i == 1) {
138           if ($cent == 1) {
139             push @textnumber, $self->{numbername}{$numblock[$i]};
140           } 
141           $cent = 0;
142       } else {
143         push @textnumber, $self->{numbername}{$numblock[$i]};
144       }
145     }
146     
147     # add thousand, million
148     if ($i) {
149       $num = 10**($i * 3);
150       if ($i == 1) {
151         push @textnumber, $self->{numbername}{$num};
152       } elsif ($numblock[$i] > 1) {
153         push @textnumber, "$self->{numbername}{$num}s";
154       } else {
155         push @textnumber, "$self->{numbername}{$num}";
156       }
157     }
158       
159     pop @numblock;
160     
161   }
162
163   join ' ', @textnumber;
164
165 }
166
167
168 sub format_ten {
169   my ($self, $amount) = @_;
170   
171   my $textnumber = "";
172   my @num = split //, $amount;
173
174   if ($amount > 20) {
175     if ($num[0] == 8) {
176       if ($num[1] > 0) {
177         $textnumber = $self->{numbername}{$num[0]*10};
178       } else {
179         $textnumber = "$self->{numbername}{$num[0]*10}s";
180       }
181     } else {
182       $textnumber = $self->{numbername}{$num[0]*10};
183     }
184     $amount = $num[1];
185   } else {
186     $textnumber = "$self->{numbername}{$amount}I";
187     $amount = 0;
188   }
189
190   $textnumber .= " ".$self->{numbername}{$amount} if $amount;
191
192   $textnumber;
193   
194 }
195
196
197 1;
198