Chaîne PHP à Float

120

Je ne connais pas du tout PHP et j'avais une petite question.

J'ai 2 variables pricePerUnitet 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 les 5000unités facturées et 1.00pour le prix.

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

Mais je n'ai aucune idée de comment analyser / convertir / convertir des variables en PHP.

Que devrais-je faire?

Nik
la source

Réponses:

202
$rootbeer = (float) $InvoicedUnits;

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

Sampson
la source
C'est la méthode la plus simple ... mais parfois j'ai rencontré des problèmes avec certaines configurations de base de données et VARCHAR>11en longueur ... je n'ai pas encore précisé pourquoi.
Talvi Watia
2
^ il convient de noter que (float) supprime 0 de la chaîne s'il s'agit du premier chiffre
Notez également que "11,000.00" affichera 11 au lieu des 11000.00 attendus
CodeJunkie
65

Vous voulez que le conscient non-locale floatvalfonction :

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

Exemple:

$string = '122.34343The';
$float  = floatval($string);
echo $float; // 122.34343
Earino
la source
4
félicitations pour avoir mentionné la connaissance des paramètres régionaux. Je viens de passer 1,5 h à rechercher un problème causé par différents paramètres régionaux entraînant la (float)conversion du premier serveur en "," et sur le second en ","
Dr. Gianluigi Zane Zanettini
23

Eh bien, si l'utilisateur écrit 1,00,000 alors 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));
HADI
la source
7
Au lieu d' ereg, utilisez preg $string=preg_replace("/[^0-9\.\-]/","",$string);
ontananza
4
Oui, ereg, cette fonction a été obsolète. Il faut donc utiliser preg à la place ereg :)
HADI
9

Gérer le balisage dans les flottants est une tâche non triviale. Dans la notation anglaise / américaine, vous formatez mille plus 46*10-2:

1,000.46

Mais en Allemagne, vous changeriez la virgule et le point:

1.000,46


Cela rend très difficile de deviner le bon nombre dans les applications multilingues.
Je suggère fortement d'utiliser Zend_Measurele Framework Zend pour cette tâche. Ce composant analysera la chaîne en flottant par la langue de l'utilisateur.

Tobias P.
la source
3
De nos jours (+3 ans), on pourrait utiliser NumberFormatter à partir de PHP 5.3 avec l' intlextension.
zamnuts
1
PHP 5.3 était disponible lorsque j'ai répondu à la question, mais jusqu'à votre commentaire, je n'étais pas au courant de cette fonction unique car il y a des dizaines de bibliothèques faisant quelque chose de similaire. Mais ils n'auront pas une aussi bonne couverture des locales que l'extension intl. Merci, je vais essayer de m'en souvenir.
Tobias P.
1

Utilisez cette fonction pour convertir une valeur flottante à partir de tout type de 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 utilisateurs saisis, les utilisateurs peuvent taper des valeurs flottantes comme bon leur semble. Ceci est vraiment utile, par exemple lorsque vous avez un projet qui est en anglais seulement mais que des gens du monde entier l'utilisent et peuvent ne pas avoir à l'esprit que le projet veut un point au lieu d'une virgule pour les valeurs flottantes. Vous pouvez lancer du javascript dans le mix et récupérer les paramètres par défaut du navigateur, mais de nombreuses personnes définissent encore ces valeurs en anglais mais en tapant toujours 1,25 au lieu de 1,25 (en particulier, mais sans s'y limiter, l'industrie de la traduction, la recherche et l'informatique)

Hafenkranich
la source
des commentaires sur pourquoi c'est mauvais / où échoue-t-il?
Hafenkranich
ou y a-t-il un moyen également flexible qui est plus rapide?
Hafenkranich
1
Il utilise l'indicateur e, qui n'est "plus pris en charge". C'est ma supposition.
Leif
0

J'étais en train de rencontrer un problème avec la manière standard de faire ceci:

$string = "one";

$float = (float)$string;

echo $float; : ( Prints 0 )

S'il n'y a pas de nombre valide, l'analyseur ne doit pas renvoyer de nombre, il doit renvoyer une erreur. (C'est une condition que j'essaie de saisir dans mon code, YMMV)

Pour résoudre ce problème, j'ai fait ce qui 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 d'analyse valide de la chaîne.

Morris Buel
la source
0

Si vous devez gérer des valeurs qui ne peuvent pas être converties séparément, vous pouvez utiliser cette méthode:

try {
    $valueToUse = trim($stringThatMightBeNumeric) + 0;
} catch (\Throwable $th) {
    // bail here if you need to
}
Jannie Theunissen
la source
0

vous pouvez suivre ce lien pour en savoir plus sur Comment convertir une chaîne / un nombre en nombre / flottant / décimal en PHP. VOICI CE QUE DIT CE LIEN ...

Méthode 1: Utilisation de la fonction number_format (). La fonction number_format () est utilisée pour convertir une chaîne en nombre. Il renvoie le nombre formaté en cas de succès, sinon il donne E_WARNING en cas d'échec.

$num = "1000.314"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num), "\n"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num, 2); 

Méthode 2: Utilisation de la conversion de type: la conversion de type peut directement convertir une chaîne en un type primitif float, double ou integer. C'est la meilleure façon de convertir une chaîne en un nombre sans aucune fonction.

// Number in string format 
$num = "1000.314"; 

// Type cast using int 
echo (int)$num, "\n"; 

// Type cast using float 
echo (float)$num, "\n"; 

// Type cast using double 
echo (double)$num; 

Méthode 3: Utilisation de la fonction intval () et floatval (). Les fonctions intval () et floatval () peuvent également être utilisées pour convertir la chaîne en ses valeurs entières et flottantes correspondantes respectivement.

// Number in string format 
$num = "1000.314"; 

// intval() function to convert  
// string into integer 
echo intval($num), "\n"; 

// floatval() function to convert 
// string to float 
echo floatval($num); 

Méthode 4: en ajoutant 0 ou en effectuant des opérations mathématiques. Le numéro de chaîne peut également être converti en entier ou en flottant en ajoutant 0 avec la chaîne. En PHP, lors d'opérations mathématiques, la chaîne est convertie implicitement en entier ou en flottant.

// Number into string format 
$num = "1000.314"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.1;
Manoj
la source