440 lines
13 KiB
PHP
440 lines
13 KiB
PHP
|
<?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<61>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);
|
|||
|
}
|
|||
|
// }}}
|
|||
|
}
|
|||
|
?>
|