'Ninety', 8 => 'Eighty', 7 => 'Seventy', 6 => 'Sixty', 5 => 'Fifty', 4 => 'Forty', 3 => 'Thirty', 2 => 'Twenty', ]; /** * @param int $num * Ex: 12 or 54. * @param mixed $default * The default value to return if we cannot determine an English representation. * If omitted or NULL, throws an exception. * Tip: If you want to support high values as numerals, just pass the number again. * @return string * Ex: 'Twelve' or 'FiftyFour'. */ public static function toCamelCase($num, $default = NULL) { if (isset(self::$lowNumbers[$num])) { return self::$lowNumbers[$num]; } $tens = (int) ($num / 10); $last = $num % 10; if (isset(self::$intervalsOfTen[$tens])) { if ($last == 0) { return self::$intervalsOfTen[$tens]; } else { return self::$intervalsOfTen[$tens] . self::$lowNumbers[$last]; } } if ($default === NULL) { throw new \RuntimeException("Cannot convert number to English: " . (int) $num); } else { return $default; } } /** * @param int $num * Ex: 12 or 54. * @param mixed $default * The default value to return if we cannot determine an English representation. * If omitted or NULL, throws an exception. * Tip: If you want to support high values as numerals, just pass the number again. * @return string * Ex: 'twelve' or 'fifty-four'. */ public static function toHyphen($num, $default = NULL) { if (isset(self::$lowNumbers[$num])) { return strtolower(self::$lowNumbers[$num]); } $tens = (int) ($num / 10); $last = $num % 10; if (isset(self::$intervalsOfTen[$tens])) { if ($last == 0) { return strtolower(self::$intervalsOfTen[$tens]); } else { return strtolower(self::$intervalsOfTen[$tens]) . '-' . strtolower(self::$lowNumbers[$last]); } } if ($default === NULL) { throw new \RuntimeException("Cannot convert number to English: " . (int) $num); } else { return $default; } } /** * Convert an English-style number to an int. * * @param string $english * Ex: 'TwentyTwo' or 'forty-four' * * @return int * 22 or 44 */ public static function toInt(string $english) { $intBuf = 0; $strBuf = strtolower(str_replace('-', '', $english)); foreach (self::$intervalsOfTen as $num => $name) { if (CRM_Utils_String::startsWith($strBuf, strtolower($name))) { $intBuf += 10 * $num; $strBuf = substr($strBuf, strlen($name)); break; } } foreach (array_reverse(self::$lowNumbers, TRUE) as $num => $name) { if (CRM_Utils_String::startsWith($strBuf, strtolower($name))) { $intBuf += $num; $strBuf = substr($strBuf, strlen($name)); break; } } if (!empty($strBuf)) { throw new InvalidArgumentException("Failed to parse english number: $strBuf"); } return $intBuf; } /** * Determine if a string looks like * * @param string $english * * @return bool */ public static function isNumeric(string $english): bool { static $pat; if (empty($pat)) { $words = array_map( function($w) { return preg_quote(strtolower($w)); }, array_merge(array_values(self::$lowNumbers), array_values(self::$intervalsOfTen)) ); $pat = '/^(\-|' . implode('|', $words) . ')+$/'; } return (bool) preg_match($pat, strtolower($english)); } }