是否有一个php函数将诸如'ten'之类的字符串转换为整数? 如果没有,那么你会怎么做呢? 尝试了谷歌和php.net搜索没有成功
答案 0 :(得分:7)
这是我刚才写的概念证明课程......请查看:
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 :(得分: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
}
答案 2 :(得分:1)
您可以使用关联数组(也称为哈希)来包含您期望的值。例如:
$assoc_arr = array("one" => 1, "ten" => 10);
$my_ans = $assoc_arr["ten"] + 5;