Spaces:
Sleeping
Sleeping
| /* 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@saparev.com> | | |
| // +----------------------------------------------------------------------+ | |
| // | |
| // $Id$ | |
| /** | |
| * Include needed files | |
| */ | |
| require_once("Numbers/Words.php"); | |
| /** | |
| * Class for translating numbers into French. | |
| * | |
| * @author Kouber Saparev <kouber@saparev.com> | |
| * @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@saparev.com> | |
| * @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@saparev.com> | |
| */ | |
| 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@saparev.com> | |
| */ | |
| 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); | |
| } | |
| // }}} | |
| } | |