Форматирование десятичного вывода при умножении всех числовых значений в строку? - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть этот случай, когда мне нужно умножить числа строки, но некоторые значения указаны в евро, а некоторые в процентах.Я сделал это так далеко, как код идет:

    $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%,test4: 22. 5 %

Таким образом, когда форматом € является значение для его форматирования XX.YY €, и когда это процентное значение, отформатируйте его XX.YY%, когда процентное значение равносотни и XX.Y%, когда десятичный процент равен десятой.Я попытался округлить.Возможно я не ставлю это в нужное место.Я также попытался заменить [0-9] часть регулярного выражения, чтобы найти только десятичные дроби, но это приводит к другим проблемам.Немного застрял здесь.Любая помощь приветствуется!Спасибо!

1 Ответ

0 голосов
/ 11 декабря 2018

Вы можете использовать

$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 демо

Регламент будет соответствовать

  • (\d+(?:\.\d+)?) - Группа 1: одна или несколько цифр с последующей необязательной последовательностью ., за которой следуют 1+ цифр
  • (\s*[€%]) - группа 2: 0+ пробелов, сопровождаемых или %.

Функция round округляет результат умножения, а number_format форматирует число, как вам нужно, с двумя цифрами после десятичного разделителя.

...