web-dev-qa-db-fra.com

Conversion d'un nombre avec virgule comme point décimal en virgule flottante

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.

58
Aine

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.

96
Teekin

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.

16
Björn

Vous pouvez utiliser la classe NumberFormatter avec sa méthode parse .

11
Gumbo

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
8
Ramon

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.

7
Paul Norman

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
6
Adrian Piechota

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

2
Yishai Landau