Multiplications de string

Par codimix, il y a 14 ans


Bonsoir,
Je suis un peut perdu, j'ai besoin de votre aide please :)

J'ai une variable $prix = "3 348.79";

Celle ci dois être multiplié par
$quantite = 3;

$prix = "3 348.79";
$quantite = 3;
$prix_total = ($prix*$quantite); // résultat 9

Jusqu'à là sa va, mais j'ai le hic du espace entre les 3 "3 348.79".
Php ignore tout ce qui est après l'espace.

Comment faire pour qu'il ignore juste l'espace?
J'ai essayé de faire un str_replace(' ','',$prix);
Mais sa ne marche pas.

Résumé :
Comment multiplier un INT avec un STRING avec un espace ?

Merci d'avance.

24 réponses

codimix, il y a 14 ans

netbeans.... Je vais voir si je le re-enregistre

Regarde, si je fais

$prix2 = explode(' ', $prix); //3 348.79
         print_r( $prix2); // Array ( [0] => 3 348.79 )

Mais si je fais

$prix2 = explode(' ', "3 348.79"); //3 348.79
                   print_r( $prix2); // Array ( [0] => 3 [1] => 348.79 )

ça marche

codimix, il y a 14 ans

Netbeans me dis qu'il est enregistré en UTF-8

MrGuillou, il y a 14 ans

Bizarre :|

codimix, il y a 14 ans

Oui trop ! Je me casse la tête là ^^

PS: regarde mon post d'avant "Regarde, si je fais ..."
Merci beaucoup de m'aider à cette heure-ci !

MrGuillou, il y a 14 ans

Bonsoir,

$prix=str_replace(' ','',$prix);

Il faut lui donner 3 paramètres et normalement ça marche.

codimix, il y a 14 ans

Lit mon message !

WTF

J'ai dis que j'ai essayé. Et cela ne marche pas.

MrGuillou, il y a 14 ans

J'ai testé ça chez moi.

<?php
$p = '3 333.33';
$m = 3;
$p=str_replace(' ','',$p);
echo $p;
echo '<br>';
echo $p * $m;
//Résultat :
//3333.33
//9999.99
?>

Donc ton problème n'est pas un problème d'espace.
Au passage les parenthèses ne servent à rien.

Le seul moyen d'obtenir le résultat que tu a, est de passer un caractère invisible comme (alt + 0160) dans le premier paramètre de la fonction str_replace

codimix, il y a 14 ans

Je récupère ma variable prix à partir de json :

{"prix":"3\u00a0348.79","quantite":3,"poids":"22"}

Je fais json_decode($json, TRUE);

Puis je fais

$prix = $json'prix'];
$prix=str_replace(' ','',$prix);
$quantite = $json'quantite'];
$prix_total = $prix*$quantite; // Résultat 9 même avec un str_replace
MrGuillou, il y a 14 ans

J'ai trouvé ton problème.
Ta page est en ISO et tu récupères des données en utf8.
la solution est d'appliquer utf8_decode sur ton prix

$prix = utf8_decode($json'prix']);

Mon code de test.

<?php
$j = '{"prix":"3\u00a0348.79","quantite":3,"poids":"22"}';
$j = json_decode($j, TRUE);
$p = $j'prix'];
$m = $j'quantite'];
echo $p;
echo '<br>';
$p = utf8_decode($p);
echo $p;
echo '<br>';
$p=str_replace(" ","",$p);
echo $p;
echo '<br>';
echo $p * $m;
$prix_total = $p*$m;
echo '<br>';
echo $prix_total;
?>
codimix, il y a 14 ans

Ma page est en utf8.

Content-Type: text/html; charset=UTF-8

echo $prix; //3 348.79
 echo $prix2 = str_replace(' ', '', utf8_decode($prix)); //3 348.79
MrGuillou, il y a 14 ans

mais si tu fais echo $prix; il te donne bien 3 348.79 et pas un truc dans le genre 3Â 348.79

PS : regarde bien le code source de la page généré et pas le résulta affiché par le navigateur.

codimix, il y a 14 ans

Si j'enleve

header('Content-Type: text/html; charset=UTF-8');

il m'affiche 3Â...

Si non non :

3 348.79<br/>Array
(
    [0] => 3 348.79
)
MrGuillou, il y a 14 ans

Alors là je bloque dure dure :|

codimix, il y a 14 ans

J'ai besoin de grafikart :D

revlam, il y a 14 ans

Peux-tu nous envoyer ton code source ? Ou c'est trop galère à reproduire ?
Car la pour le coup je vois pas non plus, j'ai besoin d'avoir les fichiers sous les yeux.

Grafikart, il y a 14 ans

Tu as essayer de convertir $prix en float ?
floatval($prix) ? avant de multiplier ?

revlam, il y a 14 ans

Normalement le floatval est implicite il me semble ?
C'est vrai que j'ai vraiment l'impression que c'est un problème d'encodage/décodage, il doit y avoir un caractère foireux qui s'incruste dans la string.

Grafikart, il y a 14 ans

La vrai question c'est pourquoi il ne met pas directement $prix = 3123.45; mais bon :D

revlam, il y a 14 ans

Oui c'est pour ça que j'aurais aimé voir le code complet :))

codimix, il y a 14 ans

Bonjour,
Voilà le code json que je récupère directement par Mysql (en UTF-8 general_ci):

{
        "Id-modele": "159",
        "reference1": "Frida avec pouf",
        "codeunique": "",
        "finition": "Patch Suzani",
        "Reference": "Frida avec pouf",
        "Notes": "",
        "dim_plaque_largeur": "68",
        "dim_plaque_hauteur": "98",
        "épaisseur": "88",
        "poids_kg_m2": "22",
        "unite_de_vente": "piece",
        "disponibilité": "0",
        "delais_de_livraison_si_disponible_en_jours": "5 à 10",
        "delais_de_livraison_si_indisponible_en_jours": "60 à 90",
        "pdf_catalogue_produit": "",
        "pdf_fiche_technique": "",
        "pdf_manuel_dinstallation": "",
        "prix_achat": "1 260,00",
        "prix_revient": "1 323,00",
        "Prix_public_HT_par_m2": "2 799,99",
        "Prix_public_TTC_par_m2": "3 348,79",
        "Prix_pro_HT_par_m2": "2 002,00",
        "Prix_revente_HT_par_m2": "1 540,00",
        "marge_brute_max": "2,1163982684",
        "marge_brute_moyenne": "1,5132247619",
        "marge_brute_min": "1,1640190476"
    }
]

function str_espace($str) {
    $str = str_replace(' ', '', $str);
    $return str_replace(',', '.', $str);
}
$prix = str_espace($finition'Prix_public_TTC_par_m2']); //3 348.79

C'est la colonne Prix_public_TTC_par_m2 que je chercher à multiplier ici; par la quantité que je reçois en POST en ajax.
Alors quand j'obtiens le prix, je peut faire un str_replace pour la virgule en point, mais pas avec l'espace.

Merci d'avance tout le monde :)

PS @Grafikart :

echo floatval($prix); //3
codimix, il y a 14 ans

Merci beaucoup de votre aide, même si j'ai trouvé un solution un peut barbare :

$strlen = strlen($prix);
 $prix2 = '';
 for ($index1 = 0; $index1 < $strlen; $index1++) {
     if($prix$index1] == '0' OR $prix$index1] == '1' OR $prix$index1] == '2' OR $prix$index1] == '3' 
     OR $prix$index1] == '4' OR $prix$index1] == '5' OR $prix$index1] == '6' OR $prix$index1] == '7' OR $prix$index1] == '8' OR $prix$index1] == '9' OR $prix$index1] == '.'):
      $prix2 .= $prix$index1];
      endif;
}
echo $prix2; //3348.79

Voilà,
Merci !

revlam, il y a 14 ans

Ok !
Et Comme le suggère Grafikart, pourquoi stock tu les chiffres avec un espace c'est pas très conventionnel ! Si c'est pour le côté 'joli', stock AMHA toujours tes données brut et ajoute l'espace à l'affichage ça t'économisera ce genre de prises de têtes.

codimix, il y a 14 ans

C'est une importation de excel (qui mets les espaces automatiquement) vers json. Je n'ai pas le choix...
Mais le sujet est résolu :P

Merci pour tout.
I.

codimix, il y a 14 ans

J'ai trouvé le bug ! 3 mois après mais OUI ! lol.
Il existe deux codes ISO pour la touche espace. L'espace " ", et un autre qui est " ".
A cause de ça mon appli buggait !!! #WTF