convertir un grand nombre en anglais parlé
Question
La conversion de «petits» nombres en anglais n'est pas en gêne. Mais si vous gérez les numéros de précision arbitraires BCMATH, cela peut être.
Utilisation du code de:
http://marc.info/?l=php-general&m=99928281523866&w=2
Le nombre maximum semble être:
deux milliards cent quarante-sept millions quatre cent quatre-vingt-trois mille six cent quarante-sept
Quelqu'un connaît une fonction pour convertir des nombres plus grands que cela?
La solution
Vous devez écrire votre propre fonction, je suggère d'utiliser des nombres comme une chaîne, laissez un soustraire comme ceci:
$string = "12356";
$text="";
// level means 0-ones, 1- thousand , 2 million, 3 billion etc...
$level=0;
//until string has no character left
while ($len=getval($string)){
// get partial number from 0 to 999
$string_partial = substr($string, (strlen($string)-$len)) ;
// get hundreds
$hund = ($string_partial - ($string_partial % 100))/100;
// get tens
$tens = $string_partial - ($hund *100);
$tens = ($tens - ($tens %10))/10;
// get ones
$ones = $string_partial - ($tens*10) - ($hund*100);
// remove partial_string form original string
$string = substr($string, 0, (strlen($string)-$len));
// edbug echoing
echo $level . " - " . $hund. " - " . $tens . " - " . $ones . "<br>";
// you need to create a function that convert number to text only from 0 to 999 to set correct million/thousand etc, use $level.
//$text = getTextvalue($hund,$tens,$ones,$level).$text;
//increment $level
$level++;
}
function getval($n){
switch (strlen($n)){
case 0: return false;
case 1: return 1;
case 2: return 2;
default: return 3;
}
}
Exemple:
$string = "123456789";
sera sorti
$level - $hund - $tens - $ones
0 - 7 - 8 - 9
1 - 4 - 5 - 6 //thousand
2 - 1 - 2 - 3 //million
Autres conseils
Pour les nombres plus grands que PHP_MAX_INT
, vous devrez soit écrire la fonction sur un service externe, comme Wolfram Alpha.
La seule fonctionnalité PHP offre pour cela est INTL NumberFormatter
. NumberFormatter::format
Accepte des flotteurs, mais cela signifie qu'il ne peut gérer que des entiers jusqu'à 2 ^ 63-1 dans des architectures longues 64 bits ou des nombres 52 bits en 32 bits.
J'ai écrit la fonction vpi2english pour gérer des entiers aussi grands que 10 ^ 306 - 1. Cela fait partie de mon VPI Toolbox.
vpi2english(vpi('12000000110022987'))
ans =
twelve quadrillion, one hundred ten million, twenty two thousand, nine hundred eighty seven