2010-09-30 6 views
1

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

  • Назначение 1 - 100
  • Assignment 2 - 80
  • Задание 3 - 10/20
  • Назначение 4 - 68
  • Задание 5 - 8/10

Как вы можете видеть, у нас есть смесь процентов и фракций. То, что я хотел бы сделать, это проверить, является ли класс фракцией, то есть 10/20, и если это так конвертируется в процент. Существуют ли какие-либо встроенные функции php для любого действия? Я думал о создании strpos ('/' /, $ grade); проверить, была ли она фракцией, но есть ли более чистый способ? Кроме того, чтобы разбить фракцию и преобразовать ее в десятичную, моя первоначальная мысль заключалась в том, чтобы взорвать класс фракции на a/и do (array [1] * 100)/array [2].

Есть ли лучшее решение, чем я думаю?

+2

Похож на совершенно хороший вопрос программирования для меня. Почему голосование закрывается? –

+0

И кто в своей бесконечной мудрости решил использовать PHP? –

+0

Ваше решение похоже на простейшее, о котором я могу думать. – Pickle

ответ

4
if(is_nan($grade)) { 
    if(strpos('/',$grade) !== false) { 
      $numbers = explode($grade,'/'); 
      $percent = (((int)$numbers[0]/(int)$numbers[1])*100).'%'; 
    } else { 
      echo "Not a valid grade!"; 
    } 
} else { 
    $percent = $grade.'%'; 
} 

я считаю, что должно работать

не придется иметь дело с надоедливым регулярным выражением либо

+0

Пока этот выглядит как самый идеальный. Следовательно, проголосовали.Я проголосую за правильные, но это похоже на лучшее, что можно принять. У кого-то есть комментарии об обратном? Пожалуйста, позвоните мне, если вы считаете, что здесь лучше ответили. Alex Howansky's также выглядит солидно, но этот проверяет сначала, если его доля. – CogitoErgoSum

+0

технически, он проверяет, не является ли его число, а не доля. Поэтому, если один из классов A, а не 100 или 100/100, он сломается, что может быть преимуществом для другого метода, хотя некоторая логика может быть использована после проверки is_nan, чтобы убедиться, что на самом деле есть/в нем сделать его более надежным. – Ascherer

+0

добавил логику выше – Ascherer

0

О, вот хороший друг, вы можете сделать это "легко" с помощью регулярных выражений:

$lines = array(
    "10/20", 
    "20/10", 
    "90", 
); 

foreach($lines as $line){ 
    if(preg_match('#([\d]+)/([\d]+)#',$line,$matches)){ 
     print (($matches[1]*100)/$matches[2])."% "; 
    }else{ 
     print $line."% "; 
    } 

} 

возвращается 50% 200% 90%

+0

Easy и Regex никогда не могут прийти в том же предложении, даже если это указано. :) – medopal

+0

это зависит, есть регулярные выражения (как этот) Человек может читать и по-прежнему понимать, а затем есть некоторые .... ну, другие: D – Hannes

+0

[] не нужны, просто '(\ d +) ' – user187291

1

Индекс массива начинается с нуля, а не один.

$array = explode('/', $str, 2); 
if (count($array) === 2) { 
    $grade = sprintf('%.2f', 100 * $array[0]/$array[1]); 
} else { 
    $grade = $str; 
} 
2

Быстрой функция, которую вы можете просто передать значение:

function normal($number) 
{ 
    $parts = explode("/", $number); 
    return count($parts) > 1 ? ($parts[0] * 100)/$parts[1] : $parts[0]; 
} 
1

Я бы сделал это так:

public function convertFractions($givenValue){ 
     if(strpos($givenValue, "/") !== false){ 
      $strings = explode("/", $givenValue); 
      return 100 * ($strings[0]/$strings[1]); 
     } else { 
      return $givenValue; 
     } 
    } 

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

+0

Почему? Фракции используют «/». Я видел этот подход раньше и его в значительной степени то, что я написал шаг за шагом. – CogitoErgoSum

+0

Потому что я не думал правильно. Теперь я отредактирую его, чтобы использовать правильное значение. – EricBoersma

+0

@CogitoErgoSum Если это решение, которое вы выбрали для своей реализации, часто бывает полезно ответить на ваш собственный вопрос или отметить это как правильное для будущих людей, которые приходят. – EricBoersma

Смежные вопросы