New file |
0,0 → 1,439 |
<?php |
/* vim: set expandtab tabstop=4 shiftwidth=4: */ |
// +----------------------------------------------------------------------+ |
// | PHP version 4 | |
// +----------------------------------------------------------------------+ |
// | Copyright (c) 1997-2003 The PHP Group | |
// +----------------------------------------------------------------------+ |
// | This source file is subject to version 3.0 of the PHP license, | |
// | that is bundled with this package in the file LICENSE, and is | |
// | available through the world-wide-web at | |
// | http://www.php.net/license/3_0.txt. | |
// | If you did not receive a copy of the PHP license and are unable to | |
// | obtain it through the world-wide-web, please send a note to | |
// | license@php.net so we can mail you a copy immediately. | |
// +----------------------------------------------------------------------+ |
// | Authors: Kouber Saparev <kouber@php.net> | |
// +----------------------------------------------------------------------+ |
// |
// $Id: lang.fr.php,v 1.4 2004/10/22 18:22:52 kouber Exp $ |
|
/** |
* Include needed files |
*/ |
require_once("Numbers/Words.php"); |
|
/** |
* Class for translating numbers into French. |
* |
* @author Kouber Saparev <kouber@php.net> |
* @package Numbers_Words |
*/ |
class Numbers_Words_fr extends Numbers_Words |
{ |
|
// {{{ properties |
|
/** |
* Locale name. |
* @var string |
* @access public |
*/ |
var $locale = 'fr'; |
|
/** |
* Language name in English. |
* @var string |
* @access public |
*/ |
var $lang = 'French'; |
|
/** |
* Native language name. |
* @var string |
* @access public |
*/ |
var $lang_native = 'Français'; |
|
/** |
* The words for some numbers. |
* @var string |
* @access private |
*/ |
var $_misc_numbers = array( |
10=>'dix', // 10 |
'onze', // 11 |
'douze', // 12 |
'treize', // 13 |
'quatorze', // 14 |
'quinze', // 15 |
'seize', // 16 |
20=>'vingt', // 20 |
30=>'trente', // 30 |
40=>'quarante', // 40 |
50=>'cinquante',// 50 |
60=>'soixante', // 60 |
100=>'cent' // 100 |
); |
|
|
/** |
* The words for digits (except zero). |
* @var string |
* @access private |
*/ |
var $_digits = array(1=>"un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf"); |
|
/** |
* The word for zero. |
* @var string |
* @access private |
*/ |
var $_zero = 'zéro'; |
|
/** |
* The word for infinity. |
* @var string |
* @access private |
*/ |
var $_infinity = 'infini'; |
|
/** |
* The word for the "and" language construct. |
* @var string |
* @access private |
*/ |
var $_and = 'et'; |
|
/** |
* The word separator. |
* @var string |
* @access private |
*/ |
var $_sep = ' '; |
|
/** |
* The dash liaison. |
* @var string |
* @access private |
*/ |
var $_dash = '-'; |
|
/** |
* The word for the minus sign. |
* @var string |
* @access private |
*/ |
var $_minus = 'moins'; // minus sign |
|
/** |
* The plural suffix (except for hundred). |
* @var string |
* @access private |
*/ |
var $_plural = 's'; // plural suffix |
|
/** |
* The suffixes for exponents (singular). |
* @var array |
* @access private |
*/ |
var $_exponent = array( |
0 => '', |
3 => 'mille', |
6 => 'million', |
9 => 'milliard', |
12 => 'trillion', |
15 => 'quadrillion', |
18 => 'quintillion', |
21 => 'sextillion', |
24 => 'septillion', |
27 => 'octillion', |
30 => 'nonillion', |
33 => 'decillion', |
36 => 'undecillion', |
39 => 'duodecillion', |
42 => 'tredecillion', |
45 => 'quattuordecillion', |
48 => 'quindecillion', |
51 => 'sexdecillion', |
54 => 'septendecillion', |
57 => 'octodecillion', |
60 => 'novemdecillion', |
63 => 'vigintillion', |
66 => 'unvigintillion', |
69 => 'duovigintillion', |
72 => 'trevigintillion', |
75 => 'quattuorvigintillion', |
78 => 'quinvigintillion', |
81 => 'sexvigintillion', |
84 => 'septenvigintillion', |
87 => 'octovigintillion', |
90 => 'novemvigintillion', |
93 => 'trigintillion', |
96 => 'untrigintillion', |
99 => 'duotrigintillion', |
102 => 'trestrigintillion', |
105 => 'quattuortrigintillion', |
108 => 'quintrigintillion', |
111 => 'sextrigintillion', |
114 => 'septentrigintillion', |
117 => 'octotrigintillion', |
120 => 'novemtrigintillion', |
123 => 'quadragintillion', |
126 => 'unquadragintillion', |
129 => 'duoquadragintillion', |
132 => 'trequadragintillion', |
135 => 'quattuorquadragintillion', |
138 => 'quinquadragintillion', |
141 => 'sexquadragintillion', |
144 => 'septenquadragintillion', |
147 => 'octoquadragintillion', |
150 => 'novemquadragintillion', |
153 => 'quinquagintillion', |
156 => 'unquinquagintillion', |
159 => 'duoquinquagintillion', |
162 => 'trequinquagintillion', |
165 => 'quattuorquinquagintillion', |
168 => 'quinquinquagintillion', |
171 => 'sexquinquagintillion', |
174 => 'septenquinquagintillion', |
177 => 'octoquinquagintillion', |
180 => 'novemquinquagintillion', |
183 => 'sexagintillion', |
186 => 'unsexagintillion', |
189 => 'duosexagintillion', |
192 => 'tresexagintillion', |
195 => 'quattuorsexagintillion', |
198 => 'quinsexagintillion', |
201 => 'sexsexagintillion', |
204 => 'septensexagintillion', |
207 => 'octosexagintillion', |
210 => 'novemsexagintillion', |
213 => 'septuagintillion', |
216 => 'unseptuagintillion', |
219 => 'duoseptuagintillion', |
222 => 'treseptuagintillion', |
225 => 'quattuorseptuagintillion', |
228 => 'quinseptuagintillion', |
231 => 'sexseptuagintillion', |
234 => 'septenseptuagintillion', |
237 => 'octoseptuagintillion', |
240 => 'novemseptuagintillion', |
243 => 'octogintillion', |
246 => 'unoctogintillion', |
249 => 'duooctogintillion', |
252 => 'treoctogintillion', |
255 => 'quattuoroctogintillion', |
258 => 'quinoctogintillion', |
261 => 'sexoctogintillion', |
264 => 'septoctogintillion', |
267 => 'octooctogintillion', |
270 => 'novemoctogintillion', |
273 => 'nonagintillion', |
276 => 'unnonagintillion', |
279 => 'duononagintillion', |
282 => 'trenonagintillion', |
285 => 'quattuornonagintillion', |
288 => 'quinnonagintillion', |
291 => 'sexnonagintillion', |
294 => 'septennonagintillion', |
297 => 'octononagintillion', |
300 => 'novemnonagintillion', |
303 => 'centillion' |
); |
// }}} |
|
// {{{ _splitNumber() |
|
/** |
* Split a number to groups of three-digit numbers. |
* |
* @param mixed $num An integer or its string representation |
* that need to be split |
* |
* @return array Groups of three-digit numbers. |
* |
* @access private |
* @author Kouber Saparev <kouber@php.net> |
* @since PHP 4.2.3 |
*/ |
|
function _splitNumber($num) |
{ |
if (is_string($num)) { |
$ret = array(); |
$strlen = strlen($num); |
$first = substr($num, 0, $strlen%3); |
preg_match_all('/\d{3}/', substr($num, $strlen%3, $strlen), $m); |
$ret =& $m[0]; |
if ($first) array_unshift($ret, $first); |
return $ret; |
} |
else |
return explode(' ', number_format($num, 0, '', ' ')); // a faster version for integers |
} |
// }}} |
|
// {{{ _showDigitsGroup() |
|
/** |
* Converts a three-digit number to its word representation |
* in French language. |
* |
* @param integer $num An integer between 1 and 999 inclusive. |
* |
* @param boolean $last A flag, that determines if it is the last group of digits - |
* this is used to accord the plural suffix of the "hundreds". |
* Example: 200 = "deux cents", but 200000 = "deux cent mille". |
* |
* |
* @return string The words for the given number. |
* |
* @access private |
* @author Kouber Saparev <kouber@php.net> |
*/ |
function _showDigitsGroup($num, $last = false) |
{ |
$ret = ''; |
|
// extract the value of each digit from the three-digit number |
$e = $num%10; // ones |
$d = ($num-$e)%100/10; // tens |
$s = ($num-$d*10-$e)%1000/100; // hundreds |
|
// process the "hundreds" digit. |
if ($s) { |
if ($s>1) { |
$ret .= $this->_digits[$s].$this->_sep.$this->_misc_numbers[100]; |
if ($last && !$e && !$d) { |
$ret .= $this->_plural; |
} |
} else { |
$ret .= $this->_misc_numbers[100]; |
} |
$ret .= $this->_sep; |
} |
|
// process the "tens" digit, and optionally the "ones" digit. |
if ($d) { |
// in the case of 1, the "ones" digit also must be processed |
if ($d==1) { |
if ($e<=6) { |
$ret .= $this->_misc_numbers[10+$e]; |
} else { |
$ret .= $this->_misc_numbers[10].'-'.$this->_digits[$e]; |
} |
$e = 0; |
} elseif ($d>5) { |
if ($d<8) { |
$ret .= $this->_misc_numbers[60]; |
$resto = $d*10+$e-60; |
if ($e==1) { |
$ret .= $this->_sep.$this->_and.$this->_sep; |
} |
elseif ($resto) { |
$ret .= $this->_dash; |
} |
|
if ($resto) { |
$ret .= $this->_showDigitsGroup($resto); |
} |
$e = 0; |
} else { |
$ret .= $this->_digits[4].$this->_dash.$this->_misc_numbers[20]; |
$resto = $d*10+$e-80; |
if ($resto) { |
$ret .= $this->_dash; |
$ret .= $this->_showDigitsGroup($resto); |
$e = 0; |
} else { |
$ret .= $this->_plural; |
} |
} |
} else { |
$ret .= $this->_misc_numbers[$d*10]; |
} |
} |
|
// process the "ones" digit |
if ($e) { |
if ($d) { |
if ($e==1) { |
$ret .= $this->_sep.$this->_and.$this->_sep; |
} else { |
$ret .= $this->_dash; |
} |
} |
$ret .= $this->_digits[$e]; |
} |
|
// strip excessive separators |
$ret = rtrim($ret, $this->_sep); |
|
return $ret; |
} |
// }}} |
|
// {{{ toWords() |
|
/** |
* Converts a number to its word representation |
* in French language. |
* |
* @param integer $num An integer (or its string representation) between 9.99*-10^302 |
* and 9.99*10^302 (999 centillions) that need to be converted to words |
* |
* @return string The corresponding word representation |
* |
* @access public |
* @author Kouber Saparev <kouber@php.net> |
*/ |
function toWords($num = 0) |
{ |
$ret = ''; |
|
// check if $num is a valid non-zero number |
if (!$num || preg_match('/^-?0+$/', $num) || !preg_match('/^-?\d+$/', $num)) return $this->_zero; |
|
// add a minus sign |
if (substr($num, 0, 1) == '-') { |
$ret = $this->_minus . $this->_sep; |
$num = substr($num, 1); |
} |
|
// if the absolute value is greater than 9.99*10^302, return infinity |
if (strlen($num)>306) { |
return $ret . $this->_infinity; |
} |
|
// strip excessive zero signs |
$num = ltrim($num, '0'); |
|
// split $num to groups of three-digit numbers |
$num_groups = $this->_splitNumber($num); |
|
$sizeof_numgroups = count($num_groups); |
|
foreach ($num_groups as $i=>$number) { |
// what is the corresponding exponent for the current group |
$pow = $sizeof_numgroups-$i; |
|
// skip processment for empty groups |
if ($number!='000') { |
if ($number!=1 || $pow!=2) { |
$ret .= $this->_showDigitsGroup($number, $i+1==$sizeof_numgroups).$this->_sep; |
} |
$ret .= $this->_exponent[($pow-1)*3]; |
if ($pow>2 && $number>1) { |
$ret .= $this->_plural; |
} |
$ret .= $this->_sep; |
} |
} |
|
return rtrim($ret, $this->_sep); |
} |
// }}} |
} |
?> |