Blame | Last modification | View Log | RSS feed
<?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 $/*** 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', // 1620=>'vingt', // 2030=>'trente', // 3040=>'quarante', // 4050=>'cinquante',// 5060=>'soixante', // 60100=>'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;}elsereturn 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 processedif ($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" digitif ($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 numberif (!$num || preg_match('/^-?0+$/', $num) || !preg_match('/^-?\d+$/', $num)) return $this->_zero;// add a minus signif (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 infinityif (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 groupsif ($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);}// }}}}?>