65 votes

Vérifier si le nombre est décimal

J'ai besoin de vérifier en PHP si l'utilisateur a saisi un nombre décimal (comme aux États-Unis, avec le point décimal : X.XXX).

Y a-t-il un moyen fiable de le faire ?

3 votes

Ce n'est pas une définition de fonction PHP.

0 votes

C'est du Actionscript, pas du PHP.

0 votes

Merci de l'avoir remarqué, la question a été modifiée. Désolé les gars, les nuits blanches m'ont fait trouver une fonction AS.

119voto

cwallenpoole Points 34940

Vous pouvez obtenir la plupart de ce que vous voulez de is_float mais si vous vraiment ont besoin de savoir s'ils contiennent une décimale, votre fonction ci-dessus n'est pas très loin (bien que dans le mauvais langage) :

function is_decimal( $val )
{
    return is_numeric( $val ) && floor( $val ) != $val;
}

0 votes

@Felix Huh... Je suppose que non. En Python et ECMAScript, c'est la meilleure façon de gérer cela. Je l'ai échangé contre quelque chose de plus universel.

0 votes

Je ne l'ai juste pas vu avant, mais il est toujours retourné 0 pour moi (en PHP). +1 pour la mise à jour :)

22 votes

10.00 par exemple renvoient toujours faux.

43voto

77120 Points 165

Si vous voulez que "10.00" renvoie vrai, vérifiez la réponse du Hibou de la nuit.

Si vous voulez savoir si les décimales ont une valeur, vous pouvez utiliser cette réponse.

Fonctionne avec tous les types (int, float, string)

if(fmod($val, 1) !== 0.00){
    // your code if its decimals has a value
} else {
    // your code if the decimals are .00, or is an integer
}

Exemples :

(fmod(1.00,    1) !== 0.00)    // returns false
(fmod(2,       1) !== 0.00)    // returns false
(fmod(3.01,    1) !== 0.00)    // returns true
(fmod(4.33333, 1) !== 0.00)    // returns true
(fmod(5.00000, 1) !== 0.00)    // returns false
(fmod('6.50',  1) !== 0.00)    // returns true

Explication :

fmod renvoie le reste en virgule flottante (modulo) de la division des arguments, (d'où le (!== 0.00))

Opérateur de module - pourquoi ne pas utiliser l'opérateur modulus ? Par exemple ($val % 1 != 0)

Desde el Documents PHP :

Les opérandes du module sont convertis en nombres entiers (en supprimant la partie décimale) avant d'être traités.

Ce qui détruira effectivement le but de l'opération, dans d'autres langages comme le javascript, vous pouvez utiliser l'opérateur modulus

28voto

Night Owl Points 1338

Si tout ce dont vous avez besoin est de savoir si un point décimal existe dans une variable, alors ceci fera l'affaire...

function containsDecimal( $value ) {
    if ( strpos( $value, "." ) !== false ) {
        return true;
    }
    return false;
}

Cette solution n'est pas très élégante mais elle fonctionne avec les chaînes de caractères et les flottants.

Veillez à utiliser !== et non != dans le test strpos ou vous obtiendrez des résultats incorrects.

0 votes

La détection d'un point ne fonctionnera pas si, dans une langue donnée, la virgule "," est le caractère décimal. L'utilisateur peut formater le nombre en utilisant number_format() .

11voto

k102 Points 3481

Une autre façon de résoudre ce problème : preg_match('/^\d+\.\d+$/',$number); :)

7voto

Felix Kling Points 247451

La fonction que vous avez postée n'est tout simplement pas PHP.

Jetez un coup d'œil à is_float [docs] .

Editar: J'ai manqué la partie "valeur saisie par l'utilisateur". Dans ce cas, vous pouvez effectivement utiliser une expression régulière :

^\d+\.\d+$

0 votes

Cela ne vérifie que le type du nombre, pas son contenu. Donc is_float('1.14') retourne faux.

0 votes

Eh bien, il parle d'un nombre entré par l'utilisateur, qui est très probablement une chaîne. Il faut donc d'abord le convertir en nombre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X