0) { $chunk = $n % 1000; if ($chunk !== 0) { $text = self::readHundreds($chunk); $parts[] = $text . ($groups[$groupIdx] ? ' ' . $groups[$groupIdx] : ''); } $n = intdiv($n, 1000); $groupIdx++; } return implode(' ', array_reverse($parts)); } private static function readHundreds(int $n): string { if ($n < 10) return self::$ones[$n]; if ($n < 20) return 'mười' . ($n > 10 ? ($n === 15 ? ' lăm' : ' ' . self::$ones[$n - 10]) : ''); $h = intdiv($n, 100); $t = intdiv($n % 100, 10); $u = $n % 10; $result = ''; if ($h > 0) $result .= self::$ones[$h] . ' trăm'; if ($t === 0 && $u === 0) return $result; if ($t === 0) { // hàng trăm > 0, hàng chục = 0 $result .= ' linh ' . self::$ones[$u]; } elseif ($t === 1) { $result .= ($h > 0 ? ' ' : '') . 'mười' . ($u > 0 ? ($u === 5 ? ' lăm' : ' ' . self::$ones[$u]) : ''); } else { $result .= ($h > 0 ? ' ' : '') . self::$ones[$t] . ' mươi'; if ($u === 1) $result .= ' mốt'; elseif ($u === 4) $result .= ' tư'; elseif ($u === 5) $result .= ' lăm'; elseif ($u > 0) $result .= ' ' . self::$ones[$u]; } return $result; } }