2016-12-10 6 views
0

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

Пример; На одной странице есть цвет атрибутов, длина A и длина B. Данные продукта A в настоящее время выводятся на диаграмме как: синий, 5.5, 10.75. Мы хотели бы, чтобы он выводил: Синий, 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 } ?> 

ответ

0

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

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

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> 
0

с помощью этого алгоритма: Converting float decimal to fraction

попробовать это:

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