web-dev-qa-db-fra.com

PHP enlève les virgules des chaînes numériques

En PHP, j'ai un tableau de variables qui sont TOUTES les chaînes. Certaines des valeurs stockées sont des chaînes numériques avec des virgules.

Ce dont j'ai besoin:

Un moyen de couper les virgules des chaînes, et le faire UNIQUEMENT pour les chaînes numériques. Ce n'est pas aussi simple qu'il y paraît. La raison principale est que les échecs suivants ont échoué:

$a = "1,435";

if(is_numeric($a))
    $a = str_replace(',', '', $a);

Cela échoue parce que $a = "1435" est numérique. Mais $a = "1,435" n'est pas numérique. Comme certaines des chaînes que je reçois seront des phrases régulières avec des virgules, je ne peux pas exécuter de remplacement de chaîne sur chaque chaîne.

43
user1082428

Non testé, mais probablement quelque chose comme if(preg_match("/^[0-9,]+$/", $a)) $a = str_replace(...)

21
Kenaniah

Faites-le dans l'autre sens:

$a = "1,435";
$b = str_replace( ',', '', $a );

if( is_numeric( $b ) ) {
    $a = $b;
}
88
JJJ

Le plus simple serait:

$var = intval(preg_replace('/[^\d.]/', '', $var));

ou si vous avez besoin de float:

$var = floatval(preg_replace('/[^\d.]/', '', $var));
17
Jayela

Essayez ceci. Cela a fonctionné pour moi

number_format(1235.369,2,'.','')

si vous utilisez number_format comme ceci number_format(1235.369,2) la réponse sera 1,235.37

mais si vous utilisez comme ci-dessous

number_format(1235.369,2,'.','') la réponse sera 1235.37

il supprime le "," de "1,235.37"

2
kaushi
 function cleanData($a) {

     if(is_numeric($a)) {

     $a = preg_replace('/[^0-9,]/s', '', $a);
     }

     return $a;

}
2
Ryan

Si vous voulez supprimer les virgules des nombres à l'intérieur d'une chaîne qui aussi contient des mots, la meilleure façon, à mon avis, serait d'utiliser preg_replace_callback:

Exemple:

$str = "Hey hello, I've got 12,500 kudos for you, spend it well"

function cleannr($matches)
{
    return str_replace("," , "" , $matches["nrs"]);
}

$str = preg_replace_callback ("/(?P<nrs>[0-9]+,[0-9]+)/" , "cleannr" , $str);


Sortie:

"Salut bonjour, j'ai 12500 bravo pour toi, passe-le bien"


Dans ce cas, le modèle (regex) diffère de celui indiqué dans la réponse acceptée, car nous ne souhaitons pas supprimer les autres virgules (ponctuation).

Si nous utilisions /[0-9,]+/ ici au lieu de /[0-9]+,[0-9]+/ le résultat serait:

"Salut bonjour j'ai 12500 bravo pour toi bien dépenser"

1
Flaxious

Cela semble être la solution idéale pour ce que vous cherchez: filter_var():

$a = filter_var($a, FILTER_VALIDATE_FLOAT, FILTER_FLAG_ALLOW_THOUSAND);

(Notez qu’il utilise FILTER_VALIDATE_FLOAT au lieu de FILTER_VALIDATE_INT car celui-ci n’a pas actuellement d’option FILTER_FLAG_ALLOW_THOUSAND).

0
orrd