J'ai une liste de prix avec une virgule pour un point décimal et un point comme séparateur de milliers.
Quelques exemples:
12,30
116,10
1.563,14
Ceux-ci viennent dans ce format d'un tiers. Je veux les convertir en float et les ajouter ensemble.
Quelle est la meilleure façon de procéder? number_format ne semble pas fonctionner avec ce format, et str_replace semble excessif, car je dois le faire plusieurs fois sur chaque nombre.
Y a-t-il une meilleure façon? Merci.
Utiliser str_replace()
pour supprimer les points n'est pas excessif.
$string_number = '1.512.523,55';
// NOTE: You don't really have to use floatval() here, it's just to prove that it's a legitimate float value.
$number = floatval(str_replace(',', '.', str_replace('.', '', $string_number)));
// At this point, $number is a "natural" float.
print $number;
C’est presque certainement le moyen le moins gourmand en ressources de calcul, et même si vous utilisez une fonction de fantaisie pour le faire, il ya de fortes chances que ce soit ce que vous faites sous le capot.
Si vous utilisez PHP 5.3 ou supérieur, vous pouvez utiliser numfmt_parse pour faire "un numéro_format inversé". Si vous ne l'êtes pas, vous vous contentez de remplacer les occurrences par preg_replace/str_replace.
Vous pouvez utiliser la classe NumberFormatter avec sa méthode parse
.
Cette fonction est compatible pour les nombres avec des points ou des virgules en décimales
function floatvalue($val){
$val = str_replace(",",".",$val);
$val = preg_replace('/\.(?=.*\.)/', '', $val);
return floatval($val);
}
$number = "1.325.125,54";
echo floatvalue($number); // The output is 1325125.54
$number = "1,325,125.54";
echo floatvalue($number); // The output is 1325125.54
En supposant qu'ils se trouvent dans un fichier ou un tableau, effectuez simplement le remplacement en tant que lot (c'est-à-dire en une seule fois):
$input = str_replace(array('.', ','), array('', '.'), $input);
puis traitez les chiffres à partir de là en tirant pleinement parti de la nature mal typée de PHP.
Cela peut sembler excessif, mais convertira n'importe quel format, peu importe les paramètres régionaux:
function normalizeDecimal($val, int $precision = 4): string
{
$input = str_replace(' ', '', $val);
$number = str_replace(',', '.', $input);
if (strpos($number, '.')) {
$groups = explode('.', str_replace(',', '.', $number));
$lastGroup = array_pop($groups);
$number = implode('', $groups) . '.' . $lastGroup;
}
return bcadd($number, 0, $precision);
}
Sortie:
.12 -> 0.1200
123 -> 123.0000
123.91 -> 12345678.9100
123 456 78.91 -> 12345678.9100
123,456,78.91 -> 12345678.9100
123.456.78,91 -> 12345678.9100
123 456 78,91 -> 12345678.9100
de PHP manuel:
str_replace - Remplace toutes les occurrences de la chaîne de recherche par la chaîne de remplacement
Je voudrais aller dans cette voie, puis convertir de chaîne en float - floatval