2010-11-15 43 views
1

可能重复:
Converting words to numbers in PHP字符串转换 '十' 为整数10

是否有一个PHP函数的字符串,如 '十' 转换为整数?
如果没有,那么你会怎么做呢?
已尝试谷歌和php.net搜索没有成功

+1

可能的重复[在PHP中将单词转换为数字](http://stackoverflow.com/questions/1077600/converting-words-to-numbers-in-php) - 这里有两个很好的参考。第一个是你自己实现一个算法,另一个是预先构建的工具... – ircmaxell 2010-11-15 21:59:39

+0

我实际上认为php有一个函数用于将字符串转换为数字,因为它是一种非常强大的语言。如果没有内置函数,那么我认为这不值得。 – andrew 2010-11-15 22:24:21

+0

你在想Python。 – outis 2010-11-15 22:40:10

回答

6

这里是概念类的证明,我刚写做到这一点...检查出来:

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扩展...如果你想,我可以快速修改它以处理数字尽可能高。

1

您可以使用关联数组(即哈希)来包含您所期望的值。例如:

$assoc_arr = array("one" => 1, "ten" => 10); 
$my_ans = $assoc_arr["ten"] + 5; 
+0

这将是最好的一个简单的解决方案,即如果你只必须转换一些价值观。如果你想将任意字符串转换为数字,你必须从定义语法开始。 – user318904 2010-11-15 22:03:30

+0

没错,但不清楚答案的复杂程度。 – GreenMatt 2010-11-15 22:23:20

2
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 
}