Как преобразовать десятичный $ attribute ; во фракцию в opencart

Я работаю в Opencart 2.3, и я столкнулся с ситуацией, когда нам нужны десятичные числа, преобразованные в дроби. Я работаю с страницей category.tpl, и наши продукты выводятся в список на странице. Атрибуты различаются для каждого продукта.

Пример; На одной странице есть цвет атрибутов, длина A и длина B. Данные продукта A в настоящее время выводятся на диаграмме как: синий, 5.5, 10.75. Мы хотели бы, чтобы он выводил: Blue, 5 1/2, 10 3/4

Есть ли все равно, чтобы поместить переменную $ attribute ['text']; в фильтр, который выплевывает фракцию (вместо десятичной)? Кроме того, обратите внимание, что нам понадобится Синий, чтобы выплюнуть Синий.

-Спасибо, Майкл П.

Вот приведенный ниже код:

<?php if ($product['attribute_groups']) { ?> <?php foreach ($product['attribute_groups'] as $attribute_group) { ?> <?php foreach ($attribute_group['attribute'] as $attribute) { ?> <div class="attGroup matchHeight"><?php echo $attribute['text']; ?> </div> <?php } ?> <?php } ?> <?php } ?> 

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

Это может быть что-то вроде этого:

 function dec2frac($x) { $dec_parts = [ 25 => '1/4', 50 => '1/2', 75 => '3/4', ]; $int_part = floor($x); echo $dec_part = ($x - $int_part) * 100; if (isset($dec_parts[$dec_part])) { $x = $int_part . ' ' . $dec_parts[$dec_part]; } return $x; } 

Тогда ваша часть HTML будет:

 <div class="attGroup matchHeight"><?php echo dec2frac($attribute['text']); ?> </div> 

с помощью этого алгоритма: Преобразование float decimal в дробь

попробуй это:

 function float2rat($n, $tolerance = 1.e-6) { $h1=1; $h2=0; $k1=0; $k2=1; $b = 1/$n; do { $b = 1/$b; $a = floor($b); $aux = $h1; $h1 = $a*$h1+$h2; $h2 = $aux; $aux = $k1; $k1 = $a*$k1+$k2; $k2 = $aux; $b = $b-$a; } while (abs($n-$h1/$k1) > $n*$tolerance); return "$h1/$k1"; } function printNiceAttr($attrString) { $arr = explode(',', $attrString); $color = trim($arr[0]); $size1A = explode('.', $arr[1]); $size1F = float2rat((float) ('0.' . $size1A[1])); $size2A = explode('.', $arr[2]); $size2F = float2rat((float) ('0.' . $size2A[1])); return $color . ', ' . $size1A[0] . ' ' . $size1F . ', ' . $size2A[0] . ' ' . $size2F; } echo printNiceAttr('Blue, 5.5, 10.75'); //outputs Blue, 5 1/2, 10 3/4