数据以字符串'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));
...
答案 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
然后只需round
或number_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)