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
Auteur
Réponse acceptée

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 !

codimix
Auteur
Réponse acceptée

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

Bonsoir,

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

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

codimix
Auteur

Lit mon message !

WTF

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

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
Auteur

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

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
Auteur

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
codimix
Auteur

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
Auteur

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

Bizarre :|

codimix
Auteur

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 !

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
Auteur

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
)

Alors là je bloque dure dure :|

codimix
Auteur

J'ai besoin de grafikart :D

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.

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

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.

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

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

codimix
Auteur

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

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
Auteur

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.