Возможный дубликат:
Преобразование слов в числа в PHP
Есть ли функция php для преобразования строки, такой как «десять» в целое число?
Если нет, то как бы вы это сделали?
Попробовали поиск в google и php.net без успеха
Вот доказательство класса концепции, которое я только что написал, чтобы сделать это … Проверьте это:
class WordToNumber { public $modifiers = array( 'hundred' => 100, ); public $negatives = array( 'minus' => true, 'negative' => true, ); public $numbers = array( 'zero' => 0, 'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4, 'five' => 5, 'six' => 6, 'seven' => 7, 'eight' => 8, 'nine' => 9, 'ten' => 10, 'eleven' => 11, 'twelve' => 12, 'thirteen' => 13, 'fourteen' => 14, 'fifteen' => 15, 'sixteen' => 16, 'seventeen' => 17, 'eighteen' => 18, 'nineteen' => 19, 'twenty' => 20, 'thirty' => 30, 'forty' => 40, 'fifty' => 50, 'sixty' => 60, 'seventy' => 70, 'eighty' => 80, 'ninety' => 90, ); public $powers = array( 'thousand' => 1000, 'million' => 1000000, 'billion' => 1000000000, ); public function __construct() { } public function parse($string) { $string = $this->prepare($string); $parts = preg_split('#\s+#', $string, -1, PREG_SPLIT_NO_EMPTY); $buffer = 0; $lastPower = 1; $powers = array( 1 => 0, ); $isNegative = false; foreach ($parts as $part) { if (isset($this->negatives[$part])) { $isNegative = true; } elseif (isset($this->numbers[$part])) { $buffer += $this->numbers[$part]; } elseif (isset($this->modifiers[$part])) { $buffer *= $this->modifiers[$part]; } elseif (isset($this->powers[$part])) { if ($buffer == 0) { //Modify last power $buffer = $powers[$lastPower]; unset($powers[$lastPower]); $power = $lastPower * $this->powers[$part]; $powers[$power] = $buffer; $lastPower = $power; $buffer = 0; } else { $powers[$this->powers[$part]] = $buffer; $buffer = 0; $lastPower = $this->powers[$part]; } } else { throw new LogicException('Unknown Token Found: '.$part); } } if (!empty($buffer)) { $powers[1] = $buffer; } $total = 0; foreach ($powers as $power => $sub) { $total += $power * $sub; } if ($isNegative) { $total *= -1; } return $total; } protected function prepare($string) { $string = preg_replace('#(\s+|-|\band\b)#i', ' ', $string); $string = mb_convert_case($string, MB_CASE_LOWER); return $string; } }
И тест:
$parser = new WordToNumber(); $strings = array( 'one hundred and fifty two', 'fifteen', 'one thousand million', 'four hundred thousand five hundred fourty three', 'fifteen hundred', 'one thousand twelve hundred', 'negative two', 'minus three hundred and fifty seven thousand four hundred and two', ); foreach ($strings as $str) { echo $parser->parse($str).' - '.$str."\n"; }
И результаты:
152 - one hundred and fifty two 15 - fifteen 1000000000 - one thousand million 400543 - four hundred thousand five hundred fourty three 1500 - fifteen hundred 2200 - one thousand twelve hundred -2 - negative two -357402 - minus three hundred and fifty seven thousand four hundred and two
Он не поддерживает огромные количества (следовательно, почему миллиард – это самая большая сила), но его нужно модифицировать тривиально, чтобы поддерживать их, используя расширение bcmath … Если вы хотите, я мог бы быстро изменить его, чтобы работать с числами так же высоко, как вы хотите.
function smallTextIntToDigits($x) { $lilx = lcase($x) $data = array('one'=>1,'two'=>2,'three'=>3,'four'=>4,'five'=>5,'six'=>6,'seven'=>7,'eight'=>8,'nine'=>9,'ten'=>10,'eleven'=>11,'twelve'=>12,'thirteen'=>13,'fourteen'=>14,'fifteen'=>15); if (isset($data[$lilx])) return $data[$lilx]; elseif (isset(data[lcase(str_replace('teen', '', $x))]) return data[(str_replace('teen', '', lcase($x))] + 10; return -1; //harder stuff, recurse on big ones. blah blah blah }
Вы можете использовать ассоциативный массив (aka hash), чтобы содержать ожидаемые значения. Например:
$assoc_arr = array("one" => 1, "ten" => 10); $my_ans = $assoc_arr["ten"] + 5;