Пресмятане на string?

djman

Registered
Здравейте,
Имам string "63/10", което математически е 6.3, но как да го получа? Пробвах с floatval(), но се получава 63... Благодаря предварително! :)
 
tedo96 каза:
Еми просто:
PHP:
$var = 63/10;
echo $var;

Добре де, то се променя винаги и винаги е стринг от типа "63/10" или "2/1" или "14/10" - става дума за блендата от exif информацията на снимка и като дам echo на това, естествено, излиза именно 63/10 а не 6.3 ...
 
djman каза:
tedo96 каза:
Еми просто:
PHP:
$var = 63/10;
echo $var;

Добре де, то се променя винаги и винаги е стринг от типа "63/10" или "2/1" или "14/10" - става дума за блендата от exif информацията на снимка и като дам echo на това, естествено, излиза именно 63/10 а не 6.3 ...
Излиза ти така защото ти е стринг. Трябва да ги кастнеш към int.
 
Намерих това...

PHP:
function calcString($mathString) {
    $cf_DoCalc = create_function("", "return (" . $mathString . ");");
    return $cf_DoCalc();
}

Честно казано не разбрах как работи, но работи - получавам 6.3. :)
 
Не го използвай този код! Това е супер голяма дупка в сайта ти. Могат да имат достъп до файловете и базата данни. Прочети за create_function (прави PHP функция с произволно име от текст). Кода, който си дал ще стане нещо подобно на:
Код:
function bad76hnr31() {
    return (63/10);
}
Ако има и друг PHP код то той ще се изпълни и затова преди да ползваш този код трябва да премахваш символите, който не ти трябват (всичко различно от 0123456789+-*/()). Все пак не ти препоръчвам да го правиш с PHP. Може с джаваскрипт да се измисли нещо с eval (поне няма да се изпълни от сървъра). Ето по-сигурният начин, който не ти го препоръчвам, защото не знам до колко съм го защитил, но е по-добър от този, който използваш сега:
Код:
<?php
	$string = "63/10+1<a href=\"#\">hack</a>1"; //условието
	$secured = preg_replace("/[^0-9\+\-\*\/\(\)]/", "", $string); //премахване на ненужните символи
	$exec = @eval("\$result = $secured;"); //изпълняване на $secured като PHP код
	echo "Разкриптираното условие е: <b>".$secured."</b>.<br />";
	if (is_null($exec)) echo "Резулата за <b>".htmlspecialchars($string)."</b> е: ".$result;
	else echo "Грешно условие <b>".htmlspecialchars($string)."</b>!";
?>
 
@marian е абсолютно прав. Тук няма нужда от такива рискови действия.
Щом стринга е винаги е във формат "число/число", защо не направиш следното:
PHP:
// Променлива, съдържа стрингът, който ще изследваме
$string = '63/3';
// Проверяваме за валиден формат число/число
// Ако премине успешно проверката
// в масива $matches ще изглежда така: array('63/3', '63', '3')
if ((bool)preg_match('#^([0-9]{1,4})/([0-9]{1,4})$#', $string, $matches) === TRUE) {
     // Понеже стойностите се връщат от тип string
     // е нужно да ги превърнем в числа
     $first = intval($matches[1]);
     $second = intval($matches[2]);

     // Извършваме операцията
     echo ($first / $second);
}
else {
     // Ако не премине проверката, се изважда съобщение
     echo 'невалиден формат';
}

Обърни внимание че в regex-а има на две места {1,4} Това налага броят на цифрите от двете страни на наклонената страна да бъдат между 1 и 4. Ако очакваш по-малки цифри, спокойно можеш да го промениш на {1,3} или {1,2} :)
 

Back
Горе