「小さい」数字を英語に変換するのは面倒ではありません。しかし、BCMath Arbitrary Precision の数値を処理する場合は、それが可能です。
以下のコードを使用:
http://marc.info/?l=php-general&m=99928281523866&w=2
最大数は次のようです。
20 億 147 万 483 千 647
それより大きい数値を変換する関数を知っている人はいますか?
「小さい」数字を英語に変換するのは面倒ではありません。しかし、BCMath Arbitrary Precision の数値を処理する場合は、それが可能です。
以下のコードを使用:
http://marc.info/?l=php-general&m=99928281523866&w=2
最大数は次のようです。
20 億 147 万 483 千 647
それより大きい数値を変換する関数を知っている人はいますか?
独自の関数を作成する必要があります。数字を文字列として使用することをお勧めします。次のように減算します。
$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;
}
}
例:
$string = "123456789";
出力します
$level - $hund - $tens - $ones
0 - 7 - 8 - 9
1 - 4 - 5 - 6 //thousand
2 - 1 - 2 - 3 //million
より大きい数値の場合、 WolframAlphaPHP_MAX_INT
などの外部サービスに依存して関数を作成する必要があります。
これに対して PHP が提供する唯一の機能は、Intl のNumberFormatter
. NumberFormatter::format
は float を受け入れますが、これは、64 ビット長のアーキテクチャでは 2^63-1 までの整数、または 32 ビット長のアーキテクチャでは 52 ビットの数値しか処理できないことを意味します。
10^306 - 1 の整数を処理する vpi2english 関数を作成しました。これはVPI ツールボックスの一部です。
vpi2english(vpi('12000000110022987'))
ans =
twelve quadrillion, one hundred ten million, twenty two thousand, nine hundred eighty seven