2012-09-29 25 views
13

Eventuali duplicati:
Check if a variable is a natural numberequivalente PHP della funzione parseInt di JavaScript?

appena incontrato dove ho bisogno di disinfettare un ingresso e rimuovere tutti i caratteri non-cifra con PHP. Ho pensato di fare da solo una funzione, ma prima volevo controllare le possibili funzioni built-in, quindi non dovrò sprecare altro tempo per reinventare la ruota.

+0

controllare [php.net/Type Casting] (http://php.net/manual/en/language.types-tygl-juggling.php) – air4x

+0

Perché non usare solo intval? – endy

risposta

23

È possibile utilizzare le espressioni regolari, come di seguito

$int = (int) preg_replace('/\D/', '', $strNonNumeric); 

O

$int = (int) preg_replace('/[^0-9]/', '', $strNonNumeric); 
+0

ah, esattamente quello che volevo. Molte grazie. – think123

+2

@ think123 - vale la pena sottolineare che (a) questo non produce un int; è ancora una stringa, anche se contiene solo cifre, e (b) regex è eccessivo per questo scenario. – Spudley

+1

Vero, ma questo è uno di quelli che funziona davvero. Lo modifico lo stesso. – think123

2

È possibile utilizzare:

$string = "90"; //string 
$myInt = (int) $string; //parse to int 
+0

Scusa, ma non è esattamente quello che voglio. '(int)' non rimuoverà tutti i caratteri non numerici, restituirà '0' se ci sono caratteri non numerici all'interno della stringa. – think123

+2

@ think123: Il cast di tipo '(int)' farà lo stesso di 'parseInt()' in javascript. Questo è quello che hai chiesto, non è vero? –

0

È inoltre possibile utilizzare sscanf (proprio come si fa in C)

<?php 

    $str = "10"; 

    sscanf($str, "%d", $intVal); 
    $intVal *= 10; 

    echo $intVal; 
?> 

uscita:

3

Ti consiglio di utilizzare FILTER_VALIDATE_INT filtro.

about Filters on php.net

+0

-1 Si prega di non inserire un collegamento w3schools. Metti invece uno 'php.net' e ti restituirò il tuo voto. – think123

+1

+2 ti ha restituito il tuo voto, come garantito. – think123

+3

Oh, e solo per alcuni motivi: http://www.w3fools.com – think123

19

non c'è un equivalente diretto a pareseInt() in PHP perché PHP non ha un tipo di dati NaN. parseInt() produrrà NaN se il valore non può essere analizzato.

Inoltre, parseInt() ha il parametro radix, che nessuna delle opzioni PHP fornisce.

Ma detto questo, se tutto quello che vogliamo fare è trasformare una stringa in un intero, poi ci sono diverse opzioni:

$int = (int)$string; 

$int = intval($string); 

$int = settype($string,'integer'); 

Quei tre tutto il lavoro più o meno allo stesso modo. Potrebbero esserci alcuni casi limite in cui lo intval() differisce dagli altri due, ma in generale trasformeranno una stringa in un int. In assenza di NaN, tutti producono 0 (zero) se la stringa non è numerica e non può essere analizzata. Ma questo dovrebbe essere sufficiente per la maggior parte dei fini di risanamento del DB.

Se si desidera realmente un errore NaN, il più vicino si ottiene è null. È possibile ottenere questo usando filter_var():

$value = filter_var(FALSE, FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE); 

Se si desidera solo per verificare che la stringa è numerica, la funzione is_numeric() può farlo:

$bool = is_numeric($string); 

Tuttavia, restituisce vero per i decimali e anche per notazione scientifica, quindi potrebbe non essere perfetto per la maggior parte delle situazioni.Una soluzione migliore è ctype_digit() che restituisce vero se la stringa è fatto solo di cifre:

$bool = ctype_digit($string); 

Se non e di questo si adatta, c'è sempre l'opzione regex, utilizzando preg_match() o preg_replace(), ma questi sono sicuramente eccessivo per questo tipo di scenario.

+0

L'uso di (int) e intval() è molto a prova di errore, ma si tenga presente che se la stringa rappresenta un numero in virgola mobile (cioè ha decimali) , quindi queste funzioni rimuovono semplicemente ciò che viene dopo il punto. Quindi "3.999" diventa 3. – Wytze

+0

@Wytze: true, ma la domanda chiedeva specificamente di rimuovere caratteri non numerici, quindi l'ipotesi sarebbe che non fosse un decimale. Ci sono altre opzioni se devi gestire i decimali. – Spudley

Problemi correlati