$below20 = [
"", "one", "two", "three", "four", "five", "six", "seven",
"eight", "nine", "ten", "eleven", "twelve", "thirteen",
"fourteen", "fifteen", "sixteen", "seventeen", "eighteen",
"nineteen"
];
$tens = [
"", "", "twenty", "thirty", "forty", "fifty",
"sixty", "seventy", "eighty", "ninety"
];
function setBelow20AndTens(int $num) {
global $below20, $tens;
if ($num === 0) {
return "";
} elseif ($num < 20) {
return $below20[$num] . " ";
} elseif ($num < 100) {
return $tens[intdiv($num, 10)] . " " . setBelow20AndTens($num % 10);
} else {
return $below20[intdiv($num, 100)] . " hundred " . setBelow20AndTens($num % 100);
}
}
function numberToWords(int $num) {
if ($num === 0) return "zero";
$result = "";
if ($num >= 1000000000) {
$result .= setBelow20AndTens(intdiv($num, 1000000000)) . "billion ";
$num %= 1000000000;
}
if ($num >= 1000000) {
$result .= setBelow20AndTens(intdiv($num, 1000000)) . "million ";
$num %= 1000000;
}
if ($num >= 1000) {
$result .= setBelow20AndTens(intdiv($num, 1000)) . "thousand ";
$num %= 1000;
}
if ($num > 0) {
$result .= setBelow20AndTens($num);
}
return rtrim($result);
}
$n = 176283;
echo numberToWords($n) . PHP_EOL;
/*
run:
one hundred seventy six thousand two hundred eighty three
*/