-3

Hear the words I want to convert to numbers as years

two zero one seven                            => 2017
two not one seven                             => 2017
two k seventeen                               => 2017
twenty seventeen                              => 2017
two thousand and seventeen                    => 2017
two thousand seventeen                        => 2017
twenty hundred and seventeen                  => 2017
nineteen fifty two                            => 1952
nineteen hundred fifty two                    => 1952
one thousand nine hundred and fifty two       => 1952
nineteen hundred                              => 1900
one thousand twelve hundred                   => 2200
nineteen                                      => 19

1 Answers1

0
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;
    /*echo "<pre>";
    print_r($parts);*/
    foreach ($parts as $part) { 
        if (isset($this->negatives[$part])) {
            $isNegative = true;
        } elseif (isset($this->numbers[$part])) {
            $buffer .= $this->numbers[$part];
        } elseif (isset($this->special[$part])) {
            $buffer += $this->special[$part];
        } elseif (isset($this->tens[$part])) {
            $buffer += $this->tens[$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);
        }
    }
    //checking if buffer not empty
    if (!empty($buffer)) {
        $powers[1] = $buffer;
    }
    $total = 0;
    foreach ($powers as $power => $sub) {
        $total += $power * $sub;
    }
    if ($isNegative) {
        $total *= -1;
    }
    return $total;
}