我认为在PHP中有一种简单的方法可以将18 5/16
之类的字符串转换为float 18.3125
。我找不到一个简单的功能来做到这一点。有一个,还是我需要自己编写?
答案 0 :(得分:5)
我不认为这样的功能存在 - 至少不与PHP捆绑在一起。
编写一个执行此操作的函数,如果您的字符串始终具有相同的格式,则不应该太难;例如,我会说这样的事情可以解决问题:
$str = '18 5/16';
var_dump(calc($str));
function calc($str) {
$int = 0;
$float = 0;
$parts = explode(' ', $str);
if (count($parts) >= 1) {
$int = $parts[0];
}
if (count($parts) >= 2) {
$float_str = $parts[1];
list($top, $bottom) = explode('/', $float_str);
$float = $top / $bottom;
}
return $int + $float;
}
这将为您提供以下输出:
float 18.3125
你可以通过一些正则表达式获得更短的东西;我认为这样的事情应该可以解决问题:
function calc($str) {
if (preg_match('#(\d+)\s+(\d+)/(\d+)#', $str, $m)) {
return $m[1] + $m[2] / $m[3];
}
return 0;
}
否则,不是捆绑在PHP中,但已经存在,也许这个类可以帮助:Eval Math。
免责声明:我没有对其进行过测试 - 因此不太确定它是否适合您的具体情况。
答案 1 :(得分:4)
以Pascal的示例为例,这是一个更强大的解决方案,可以处理大于1且小于1的分数。
function parseFraction(string $fraction): float
{
if(preg_match('#(\d+)\s+(\d+)/(\d+)#', $fraction, $m)) {
return ($m[1] + $m[2] / $m[3]);
} else if( preg_match('#(\d+)/(\d+)#', $fraction, $m) ) {
return ($m[1] / $m[2]);
}
return (float)0;
}
这里有一些基本的测试内容,对于将这段代码与phpunit集成很有用
class FractionParserTest extends TestCase
{
/**
* < 1
* @return void
*/
public function testSimple(): void
{
$qty = '3/4';
$res = parseFraction($qty);
$this->assertEquals(0.75, $res);
}
/**
* > 1
* @return void
*/
public function testComplex(): void
{
$qty = '18 5/16';
$res = parseFraction($qty);
$this->assertEquals(18.3125, $res);
}
}