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.
Non testé, mais probablement quelque chose comme if(preg_match("/^[0-9,]+$/", $a)) $a = str_replace(...)
Faites-le dans l'autre sens:
$a = "1,435";
$b = str_replace( ',', '', $a );
if( is_numeric( $b ) ) {
$a = $b;
}
Le plus simple serait:
$var = intval(preg_replace('/[^\d.]/', '', $var));
ou si vous avez besoin de float:
$var = floatval(preg_replace('/[^\d.]/', '', $var));
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"
function cleanData($a) {
if(is_numeric($a)) {
$a = preg_replace('/[^0-9,]/s', '', $a);
}
return $a;
}
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"
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).