public static function toJapaneseNumeral($number, $type = self::NUMERAL_KANJI)
{
// Return fast on zero
if ($number == 0) {
if ($type == self::NUMERAL_READING) {
return 'zero';
} else {
return '〇';
}
}
$separator = '';
switch ($type) {
case self::NUMERAL_KANJI:
$mapPowersOfTen = self::$mapPowersOfTenKanji;
$mapDigits = self::$mapDigitsKanji;
break;
case self::NUMERAL_KANJI_LEGAL:
$mapPowersOfTen = self::$mapPowersOfTenKanjiLegal;
$mapDigits = self::$mapDigitsKanjiLegal;
break;
case self::NUMERAL_READING:
$mapPowersOfTen = self::$mapPowersOfTenReading;
$mapDigits = self::$mapDigitsReading;
$separator = ' ';
break;
default:
throw new Exception('Unknown type');
}
$exponent = strlen($number) - 1;
if ($exponent > 4) {
$exponentRemainder = $exponent % 4;
$closestExponent = $exponent - $exponentRemainder;
$power = pow(10, $closestExponent);
$remainder = $number % $power;
$roundPart = $number - $remainder;
$multiplier = (int) (($number - $remainder) / $power);
if ($type != self::NUMERAL_READING || !array_key_exists($roundPart, self::$readingExceptions)) {
$result = self::toJapaneseNumeral($multiplier, $type) . $separator . $mapPowersOfTen[$closestExponent];
} else {
$result = self::$readingExceptions[$roundPart];
}
if ($remainder != 0) {
$result .= rtrim($separator . self::toJapaneseNumeral($remainder, $type));
}
return $result;
} else {
$result = '';
while ($exponent > 0) {
$power = pow(10, $exponent);
$remainder = $number % $power;
$roundPart = $number - $remainder;
$multiplier = (int) (($number - $remainder) / $power);
if ($type != self::NUMERAL_READING || !array_key_exists($roundPart, self::$readingExceptions)) {
if ($multiplier != 1 || $exponent == 4) {
$result .= $mapDigits[$multiplier] . $separator;
}
$result .= $mapPowersOfTen[$exponent] . $separator;
} else {
$result .= self::$readingExceptions[$roundPart] . $separator;
}
$number = $remainder;
$exponent = strlen($number) - 1;
}
if ($number != 0) {
$result .= $mapDigits[$number];
}
return $result;
}
}