and*_*rew 1 php string integer
可能重复:
在PHP中将单词转换为数字
是否有一个PHP函数将诸如'ten'之类的字符串转换为整数?
如果不是那么你会怎么做呢?
尝试过谷歌和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;
}
}
Run Code Online (Sandbox Code Playgroud)
并测试:
$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";
}
Run Code Online (Sandbox Code Playgroud)
结果如下:
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
Run Code Online (Sandbox Code Playgroud)
它不支持大量数字(因此为什么亿是最大的功率),但它应该通过使用bcmath扩展来轻微修改以支持它们...如果你愿意,我可以快速修改它以使用高达数字的数字你要.
| 归档时间: |
|
| 查看次数: |
1140 次 |
| 最近记录: |