发布于 2010-11-15 23:37:27
这是一个概念类的证明我刚刚写了这样做..。看看这个:
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
它不支持庞大的数字(因此,为什么十亿是最大的力量),但它应该通过使用数学题扩展对其进行轻微的修改.如果您愿意,我可以快速地修改它以处理任意高的数字。
发布于 2010-11-15 22:05:15
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
}
发布于 2010-11-15 22:01:16
可以使用关联数组(也称为散列)来包含所期望的值。例如:
$assoc_arr = array("one" => 1, "ten" => 10);
$my_ans = $assoc_arr["ten"] + 5;
https://stackoverflow.com/questions/4189195
复制相似问题