在这种情况下,我必须将字符串的数字相乘,但其中一些值以EUR表示,而某些则以百分比表示。到目前为止,我做到了:
$string = "description: test1: 10 €, test2: 7.50 €, test3: 25%, test4: 30%";
$levelamt = 0.75;
$description = preg_replace_callback('/([0-9]+)\s*(\s€|%)/i', function($matches) use ($levelamt){
return ($matches[1] * $levelamt).$matches[2];
}, $string);
echo $description;
但是它输出:
说明:test1:7.5欧元,test2:7.37.5欧元,test3:18.75%,test4: 22.5%
我应该如何修改正则表达式以将小数相乘并舍入数字的结果?我希望输出像这样:
说明:test1:7。 50 €,test2:5。 63 €,test3:18.75%, 测试4:22。 5 %
因此,当以€值格式设置其XX.YY€时,以及以百分比值格式时,其格式为XX.YY%(百分率是百时)和XX.Y%(百分率的十进制是十进制时)。我尝试过四舍五入。也许我没有把它放在正确的地方。我还尝试替换正则表达式的 [0-9] 部分以仅查找小数,但这会带来其他问题。有点卡在这里。任何帮助表示赞赏!谢谢!
答案 0 :(得分:1)
您可以使用
$string = "description: test1: 10 €, test2: 7.50 €, test3: 25%, test4: 30%";
$levelamt = 0.75;
$description = preg_replace_callback('/(\d+(?:\.\d+)?)(\s*[€%])/i', function($matches) use ($levelamt){
return number_format(round(($matches[1] * $levelamt), 2), 2).$matches[2];
}, $string);
echo $description;
// => description: test1: 7.50 €, test2: 5.63 €, test3: 18.75%, test4: 22.50%
请参见PHP demo
正则表达式将匹配
(\d+(?:\.\d+)?)
-第1组:一个或多个数字,后跟.
的可选序列,后跟1+个数字(\s*[€%])
-第2组:0+个空格,后跟€
或%
。 round
函数将对乘法结果进行四舍五入,number_format
将根据需要设置数字格式,在小数点分隔符后两位。