web-dev-qa-db-fra.com

PHP Chaîne pour flotter

Je ne connais pas du tout PHP et j'ai posé une question rapide.

J'ai 2 variables pricePerUnit et InvoicedUnits. Voici le code qui définit ces valeurs:

$InvoicedUnits = ((string) $InvoiceLineItem->InvoicedUnits);
$pricePerUnit = ((string) $InvoiceLineItem->PricePerUnit);

Si je produis ceci, j'obtiens les valeurs correctes. Disons 5000 unités facturées et 1.00 pour le prix.

Maintenant, je dois montrer le montant total dépensé. Lorsque je multiplie ces deux ensembles, cela ne fonctionne pas (comme prévu, ce sont des chaînes).

Mais je ne sais pas comment analyser/convertir/convertir des variables en PHP.

Que devrais-je faire?

97
John
$rootbeer = (float) $InvoicedUnits;

Devrait le faire pour vous. Départ Type-Juggling . Vous devriez également lire Conversion de chaîne en nombres .

170
Sampson

Vous voulez la fonction fonction floatval non sensible à la localisation :

float floatval (mixed $ var) - Obtient la valeur float d'une chaîne.

Exemple:

$string = '122.34343The';
$float  = floatval($string);
echo $float; // 122.34343
55
earino

Eh bien, si l'utilisateur écrit 1,00,000, floatvar affichera une erreur. Alors -

floatval(preg_replace("/[^-0-9\.]/","",$input));

C'est beaucoup plus fiable.

Utilisation:

$input = '1,03,24,23,434,500.6798633 this';
echo floatval(preg_replace("/[^-0-9\.]/","",$input));
21
HADI

Traiter le balisage dans les flottants est une tâche non triviale. Dans la notation anglais/américain, vous mettez en forme mille plus 46*10-2:

1,000.46

Mais en Allemagne, vous changez de virgule et de point:

1.000,46


Il est donc très difficile de deviner le bon nombre dans les applications multilingues.
Je suggère fortement d'utiliser Zend_Measure du Zend Framework pour cette tâche. Ce composant analysera la chaîne en un flottant selon la langue de l'utilisateur.

8
Tobias P.

Utilisez cette fonction pour convertir une valeur float à partir de n'importe quel style de texte:

function parseFloat($value) {
    return floatval(preg_replace('#^([-]*[0-9\.,\' ]+?)((\.|,){1}([0-9-]{1,3}))*$#e', "str_replace(array('.', ',', \"'\", ' '), '', '\\1') . '.\\4'", $value));
}

Cette solution ne dépend d'aucun paramètre régional. Ainsi, pour les entrées utilisateur, les utilisateurs peuvent saisir des valeurs de type float de la manière qui leur convient. C'est vraiment utile, par exemple. lorsque vous avez un projet qui est uniquement en anglais mais que des gens du monde entier l’utilisent et ne pensez peut-être pas qu’il souhaite un point au lieu d’une virgule pour les valeurs flottantes. Vous pouvez utiliser du code javascript dans le mélange et récupérer les paramètres par défaut du navigateur, mais de nombreuses personnes définissent ces valeurs sur anglais tout en tapant 1,25 au lieu de 1,25 (en particulier, mais sans s'y limiter, l'industrie de la traduction, la recherche et l'informatique).

1
Hafenkranich

Je rencontrais un problème avec la manière standard de le faire:

$string = "one";

$float = (float)$string;

echo $float; : ( Prints 0 )

S'il n'y a pas de numéro valide, l'analyseur ne devrait pas renvoyer de numéro, il devrait renvoyer une erreur. (Ceci est une condition que j'essaie d'attraper dans mon code, YMMV)

Pour résoudre ce problème, j'ai procédé comme suit:

$string = "one";

$float = is_numeric($string) ? (float)$string : null;

echo $float; : ( Prints nothing )

Ensuite, avant de poursuivre le traitement de la conversion, je peux vérifier et renvoyer une erreur s'il n'y a pas eu d'analyse syntaxique valide de la chaîne.

0
Morris Buel