PHP如何从像'99 5/32'这样的字符串中提取小数

时间:2018-02-14 18:33:16

标签: php string formatting

数据以字符串'99 10/32''99 5/32''100 5/32''100 25/32'等方式到达

我需要十进制形式,所以我已经这样做了,但结果并不总是正确的:

...
    $priceRaw = '99 5/32'; // ******also could be $priceRaw = 100 15/32, etc
    $priceFrac = (str_replace("/32","",substr($priceRaw, -5))/100);
    $priceFirst = (substr($priceRaw, 0, 3)*1);
    $value = $priceFirst+$priceFrac;
// original code that failed with one digit, e.g. 5/32
// $value=str_replace("/32.","",str_replace(" ",".0",$e->plaintext));
...

3 个答案:

答案 0 :(得分:1)

按空格分割字符串以获取部件

list($priceFirst, $priceFrac) = explode(' ', $priceRaw); 
$priceFrac = (str_replace("/32","",$priceFrac)/100);
echo $value = $priceFirst+$priceFrac;

答案 1 :(得分:1)

我会受到eval的攻击,但适用于所有分数。

在空间上拆分并在计算中使用数字:

$priceRaw = '99 5/32';
list($num, $frac) = explode(' ', $priceRaw);
eval("\$result = $num + $frac;");
echo $result; // 99.15625

或者用+替换空格并计算:

$calc = str_replace(' ', '+', $priceRaw);
eval("\$result = $calc;");
echo $result; // 99.15625

然后只需roundnumber_format或您需要的任何内容。我可能会遗漏一些重要的东西,因为你的数学很有趣。

答案 2 :(得分:0)

或者我们可以去正则表达式路线:

function convFrac($in) {
    if( preg_match('#^(\d+)\s+(\d+)/(\d+)$#', $in, $match) ) {
        $tmp = array_map('intval', array_slice($match, 1));
        return $tmp[0] + $tmp[1] / $tmp[2];
    }
    throw new \Exception("Badly formatted fraction.");
}

var_dump( convFrac('99 5/32') ); // float(99.15625)