web-dev-qa-db-fra.com

Vérifier si le nombre est décimal

Je dois vérifier PHP si l'utilisateur a entré un nombre décimal (façon américaine, avec un point décimal: X.XXX)

Un moyen fiable de le faire?

32
CodeVirtuoso

Si tout ce que vous avez besoin de savoir, c'est si un point décimal existe dans une variable, alors le travail sera fait ...

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

Ce n'est pas une solution très élégante, mais cela fonctionne avec des chaînes et des flotteurs.

Assurez-vous d'utiliser! == et non! = Dans le test strpos sinon vous obtiendrez des résultats incorrects. 

20
Night Owl

_ {si vous voulez que "10.00" renvoie le chèque vrai, réponse de Night Owl} _

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

Fonctionne avec tous types de 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 de module? Par exemple. ($val % 1 != 0) 

À partir de PHP docs

Les opérandes de module sont convertis en entiers (en supprimant la partie décimale) avant traitement.

Ce qui détruit efficacement le but de l'opération, dans d'autres langages comme javascript, vous pouvez utiliser l'opérateur de module

11
77120

une autre façon de résoudre ceci: preg_match('/^\d+\.\d+$/',$number); :)

10
k102

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

Regardez is_float[docs] .

Edit: J'ai raté la partie "valeur entrée par l'utilisateur". Dans ce cas, vous pouvez réellement utiliser une expression régulière:

^\d+\.\d+$
7
Felix Kling

On m'a passé une chaîne et je voulais savoir s'il s'agissait d'une décimale ou non. J'ai fini avec ceci:

function isDecimal($value) 
{
     return ((float) $value !== floor($value));
}

J'ai fait une série de tests comprenant des nombres décimaux et des nombres non décimaux des deux côtés de zéro, et cela a semblé fonctionner.

4
Jeff V

j'utilise ceci:

function is_decimal ($price){
  $value= trim($price); // trim space keys
  $value= is_numeric($value); // validate numeric and numeric string, e.g., 12.00, 1e00, 123; but not -123
  $value= preg_match('/^\d$/', $value); // only allow any digit e.g., 0,1,2,3,4,5,6,7,8,9. This will eliminate the numeric string, e.g., 1e00
  $value= round($value, 2); // to a specified number of decimal places.e.g., 1.12345=> 1.12

  return $value;
}
1
Eric_ph

C'est une manière plus tolérante de gérer cela avec une entrée utilisateur. Cette expression rationnelle correspondra à la fois à "100" ou à "100.1" mais ne permet pas les nombres négatifs.

/^(\d+)(\.\d+)?$/
1
Chaoix

Un cludge total .. mais bon ça marche!

$numpart = explode(".", $sumnum); 

if ((exists($numpart[1]) && ($numpart[1] > 0 )){
//    it's a decimal that is greater than zero
} else {
// its not a decimal, or the decimal is zero
}
0
Duane Lortie
$lat = '-25.3654';

if(preg_match('/./',$lat)) {
    echo "\nYes its a decimal value\n";
}
else{
    echo 'No its not a decimal value';
}
0
Neocortex
   // if numeric 

if (is_numeric($field)) {
        $whole = floor($field);
        $fraction = $field - $whole;

        // if decimal            
        if ($fraction > 0)
            // do sth
        else
        // if integer
            // do sth 
}
else

   // if non-numeric
   // do sth
0
Van Bien

La solution la plus simple est 

if(is_float(2.3)){

 echo 'true';

}
0
Ayyaz Zafar

is_numeric renvoie true pour les nombres décimaux et les entiers. Donc si votre utilisateur entre 1 au lieu de 1.00, il retournera quand même true:

echo is_numeric(1); // true
echo is_numeric(1.00); // true

Vous voudrez peut-être convertir l'entier en décimal avec PHP ou laisser votre base de données le faire pour vous.

0
rybo111

Si vous travaillez avec la validation de formulaire. Ensuite, dans ce cas, formulaire d'envoi chaîne .J'ai utilisé le code suivant pour vérifier si l'entrée de formulaire est un nombre décimal ou non . J'espère que cela fonctionnera pour vous aussi.

function is_decimal($input = '') {

    $alphabets = str_split($input);
    $find = array('0','1','2','3','4','5','6','7','8','9','.'); // Please note: All intiger numbers are decimal. If you want to check numbers without point "." then you can remove '.' from array. 

    foreach ($alphabets as $key => $alphabet) {
        if (!in_array($alphabet, $find)) {
            return false;
        }
    }

    // Check if user has enter "." point more then once.
    if (substr_count($input, ".") > 1) {
        return false;
    }

    return true;
}
0
Adnan Ahmad