将字符串中的所有数值相乘时格式化十进制输出?

时间:2018-12-11 15:22:23

标签: formatting numbers decimal preg-replace string-formatting

在这种情况下,我必须将字符串的数字相乘,但其中一些值以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] 部分以仅查找小数,但这会带来其他问题。有点卡在这里。任何帮助表示赞赏!谢谢!

1 个答案:

答案 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将根据需要设置数字格式,在小数点分隔符后两位。