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?
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.
_ {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
}
(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
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
une autre façon de résoudre ceci: preg_match('/^\d+\.\d+$/',$number);
:)
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+$
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.
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;
}
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+)?$/
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
}
$lat = '-25.3654';
if(preg_match('/./',$lat)) {
echo "\nYes its a decimal value\n";
}
else{
echo 'No its not a decimal value';
}
// 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
La solution la plus simple est
if(is_float(2.3)){
echo 'true';
}
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.
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;
}