Controlla se il numero è decimale

Devo controllare in PHP se l'utente ha inserito un numero decimale (modo US, con punto decimale: X.XXX)

Qualunque modo affidabile per farlo?

Puoi get la maggior parte di ciò che vuoi da is_float , ma se hai davvero bisogno di sapere se ha un decimale, la tua function sopra non è eccessivamente lontana (anche se la lingua sbagliata):

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

Se tutto quello che devi sapere è se esiste una virgola decimale in una variabile allora questo farà il lavoro …

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

Questa non è una soluzione molto elegante ma funziona con stringhe e galleggianti.

Assicurati di usare! == e not! = Nel test strpos o otterrai risultati errati.

un altro modo per risolvere questo problema: preg_match('/^\d+\.\d+$/',$number); 🙂

La function che hai postato non è solo PHP.

is_float un'occhiata a is_float [docs] .

Modifica: ho perso la parte "valore inserito dall'utente". In questo caso puoi effettivamente usare un'espressione regolare:

 ^\d+\.\d+$ 

se vuoi "10.00" per restituire true check la risposta di Night Owl

Se vuoi sapere se i decimali hanno un valore puoi usare questa risposta.

Funziona con tutti i tipi di tipi (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 } 

Esempi:

 (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 

Spiegazione:

fmod restituisce il resto in virgola mobile (module) della divisione degli argomenti, (da cui il (! == 0.00))

Operatore module – perché non utilizzare l'operatore module? Ad esempio ($val % 1 != 0)

Dai documenti PHP :

Gli operandi del module vengono convertiti in numbers interi (eliminando la parte decimale) prima dell'elaborazione.

Che distruggerà efficacemente l'objective, in altre lingue come javascript puoi usare l'operatore module

Ho passato una string e volevo sapere se era un decimale o no. Ho finito con questo:

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

Ho eseguito una serie di test compresi decimali e non-decimali su entrambi i lati dello zero, e sembrava funzionare.

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

io uso questo:

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

Questo è un modo più tollerato di gestirlo con l'input dell'utente. Questa espressione regolare corrisponderà sia a "100" che a "100.1" ma non consente numbers negativi.

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

is_numbersc restituisce true per i decimali e gli interi. Quindi se il tuo utente immetterà pigramente 1 invece di 1.00 , verrà comunque restituito true :

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

Potresti voler convertire il numero integer in un decimale con PHP, o lasciare che il tuo database lo faccia per te.

  // if numbersc if (is_numbersc($field)) { $whole = floor($field); $fraction = $field - $whole; // if decimal if ($fraction > 0) // do sth else // if integer // do sth } else // if non-numbersc // do sth 

Un totale cludge .. ma hey funziona!

 $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 } 

La soluzione più semplice è

 if(is_float(2.3)){ echo 'true'; } 

Forse prova a guardare anche a questo

!is_int()