multiplier une chaine de caracteres pa un nombre

Par maewa, il y a 6 ans


Bonjour,

Voila je rencontre un petit problème avec mon code.

je veux afficher une fraction en php : pour cela j'ai écrit

$a=3;

$b=2;

$c="$a/$b";

echo $c; //cela affiche 3/2

mais d'autre part je veux multiplier $c par un nombre entier;

echo $c*2; //cela m'affiche une err
( ! ) Notice: A non well formed numeric value encountered

si quelqu'un peut m'aider

et merci d'avance;

5 réponses

Azralth, il y a 6 ans

Salut,
Il faut juste supprimer les guillemet :
$c=$a/$b;
Sinon ton $c est considéré comme (string).

Ensuite tu n'auras plus de soucis à faire ta multiplication.

maewa, il y a 6 ans

salut,
merci pour ta reponse ,mais j'ai besoins d'afficher la fraction "$a/$b", y a -t-il une méthode pour afficher la fractio sans utilser " "

alain_47, il y a 6 ans

J ai essayé (float)$c
ca ne fonctionne pas.

J ai essayé settype($c, "float")
ca ne fonctionne pas.

A priori, il te faut creer 2 variables : une string et une numerique.
Tu peux utiliser par exemple, le meme nom de variable mais avec un underscore pour la variable string.
Ca donnerait :

$a = 3; $b = 2; $c_ = "$a/$b"; $c = $a/$b; echo "$c_ = ".$c; // 3/2 = 1.5
maewa, il y a 6 ans

merci baucoup pour ta réaction, je vais l'essayer

alain_47, il y a 5 ans

sinon avec un petit programe

index.php

<?php require_once('calcul.php'); $f = '(1*x)+(320-y)-(z*50)+(40/z)'; echo '<br>f = '.$f.'<br><br>'; $x=152 ; $y=20; $z=2; echo '... avec x . y . z = '.$x.' . '.$y.' . '.$z; calcul($f, $x, $y, $z); // ********************** echo '<br><br><hr><br>'; $f='(57954+32800)-(x*2)+(29000/y)-(456900/z)'; echo '<br>f = '.$f.'<br>'; calcul($f, $x, $y, $z);

et
calcul.php

<?php function affiche(array $tab, int $lentab) { echo '<br> f = &nbsp; '; for($i=0; $i<$lentab; $i++){ echo ' '.$tab[$i]; } } function calcul(string $f, int $x, int $y, int $z) { // 1. incorporation de la string dans un array ($tab) // avec remplacement des variables x y z par leur valeur $len=strlen($f); // = 27 caracteres dans la string '$f' $tab=[]; for($i=0; $i<$len; $i++) { switch ($f[$i]) { case 'x': $tab[$i] = $x; break; case 'y': $tab[$i] = $y; break; case 'z': $tab[$i] = $z; break; default: $tab[$i]=$f[$i]; break; } } $lentab=count($tab); // 27 elements dans $tab dont 4 integer. // 2. modif. du cast des string 'numeric' en 'integer' // et reconstitution des nombres ('3' '2' '0' -> 320 integer) for($i=0; $i<$lentab; $i++) { if( is_string($tab[$i]) && is_numeric($tab[$i]) ) { $numericBefore = preg_match('/[0-9]/', $tab[$i-1]); $numericAfter = preg_match('/[0-9]/', $tab[$i+1]); if( ($numericBefore==0) && ($numericAfter==0) ) {settype($tab[$i],'int');} else { for($j=($i+1); $j<$len; $j++) { if(is_numeric($tab[$j])) { $tab[$i]=$tab[$i].$tab[$j]; $tab[$j]='s'; } else {break ;} } settype($tab[$i],'int'); } }elseif($tab[$i]==='s'){unset($tab[$i]);} } // 3. calcul niveau 1 echo '<br><br>'; $tab = array_values($tab); $lentab = count($tab); // = 23 affiche($tab, $lentab); echo '<br>'; for ($i=0; $i<$lentab; $i++) { if ( is_integer($tab[$i]) && $tab[$i+1]!==')' ) { $operator = $tab[$i+1]; switch ($operator) { case '+': $tab[$i] = $tab[$i] + $tab[$i+2]; break; case '-': $tab[$i] = $tab[$i] - $tab[$i+2]; break; case '*': $tab[$i] = $tab[$i] * $tab[$i+2]; break; case '/': if ($tab[$i+2] !== 0){ $tab[$i] = $tab[$i] / $tab[$i+2]; if(is_float($tab[$i])){round($tab[$i],2);} } else {echo '<br>Erreur (division par 0) !';} break; default: echo '<br>erreur (operateur non valide) !'; break; } $tab[$i+1]='s'; $tab[$i+2]='s'; } elseif($tab[$i]=='s'){ unset($tab[$i]);} } $tab = array_values($tab); $lentab = count($tab); // = 15 affiche($tab, $lentab); // 4. calcul niveau 2 echo '<br>'; // on supprime les parentheses du array for ($i=0; $i<$lentab ; $i++) { if($tab[$i]=='('){ unset($tab[$i]); $tab[$i+2]='s'; }elseif($tab[$i]=='s'){ unset($tab[$i]);} } $tab = array_values($tab); $lentab = count($tab); // $lentab = 7 affiche($tab, $lentab); // 5. calcul niveau 3 (final) echo '<br><br>'; $result = 0; for($i=0; $i<$lentab; $i++) { if($i==0) { $operator = $tab[$i+1]; switch ($operator) { case '+': $result = $result + $tab[$i]+$tab[$i+2]; $tab[$i+2]='s'; break 1; case '-': $result = $result - $tab[$i]-$tab[$i+2]; break 1; case '*': $result = $tab[$i]*$tab[$i+2]; break 1; case '/': if($tab[$i+2] !== 0){ $result = $tab[$i]/$tab[$i+2]; } else {echo 'Erreur (division par 0';} break 1; default: echo 'erreur'; break 1; } $tab[$i+2]='s'; } elseif(is_int($tab[$i])) { $operator = $tab[$i-1]; switch ($operator) { case '+': $result = $result + $tab[$i]; $tab[$i+2]='s'; break 1; case '-': $result = $result - $tab[$i]; break 1; case '*': $result = $tab[$i]*$tab[$i+2]; break 1; case '/': if($tab[$i+2] !== 0){ $result = $tab[$i]/$tab[$i+2]; } else {echo 'Erreur (division par 0';} break 1; default: echo 'erreur'; break 1; } } } echo ' f = &nbsp; '.$result; }

on obtient :

= (1*x)+(320-y)-(z*50)+(40/z) ... avec x . y . z = 152 . 20 . 2 f = ( 1 * 152 ) + ( 320 - 20 ) - ( 2 * 50 ) + ( 40 / 2 ) f = ( 152 ) + ( 300 ) - ( 100 ) + ( 20 ) f = 152 + 300 - 100 + 20 f = 372 --------------------------------------------------------------------- f = (57954+32800)-(x*2)+(29000/y)-(456900/z) f = ( 57954 + 32800 ) - ( 152 * 2 ) + ( 29000 / 20 ) - ( 456900 / 2 ) f = ( 90754 ) - ( 304 ) + ( 1450 ) - ( 228450 ) f = 90754 - 304 + 1450 - 228450 f = -89608