2012-09-29 17 views
13

Mögliche Duplizieren:
Check if a variable is a natural numberPHP entspricht der parseInt-Funktion von JavaScript?

Gerade kam über, wo ich einen Eingang und entfernen Sie alle nicht-nummerische Zeichen mit PHP zu sanieren. Ich dachte daran, selbst eine Funktion zu machen, wollte aber erst einmal nach den möglichen eingebauten Funktionen suchen, so dass ich keine zusätzliche Zeit damit verbringen muss, das Rad neu zu erfinden.

+0

Überprüfen Sie [php.net/Type Casting] (http://php.net/manual/en/language.types.type-juggling.php) – air4x

+0

Warum nicht einfach intval verwenden? – endy

Antwort

23

können Sie regelmäßig verwenden Ausdruck wie unten

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

ODER

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

ah, genau das, was ich wollte. Danke vielmals. – think123

+2

@ think123 - es lohnt sich, darauf hinzuweisen, dass (a) dies kein int erzeugt; es ist immer noch eine Zeichenkette, die nur Ziffern enthält, und (b) Regex ist für dieses Szenario übertrieben. – Spudley

+1

Stimmt, aber das ist einer der tatsächlich funktioniert. Ich werde es trotzdem bearbeiten. – think123

2

können Sie verwenden:

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

Sorry, aber das ist nicht genau das, was ich will. '(int)' löscht nicht alle nicht-einstelligen Zeichen, es gibt nur '0' zurück, wenn Zeichen innerhalb der Zeichenfolge enthalten sind. – think123

+2

@ think123: Typ casting '(int)' wird das gleiche wie 'parseInt()' in Javascript. Das hast du gefragt, nicht wahr? –

0

Sie können sscanf auch verwenden (wie Sie in C tun)

<?php 

    $str = "10"; 

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

    echo $intVal; 
?> 

Ausgang:

3

würde ich empfehlen, FILTER_VALIDATE_INT Filter verwenden.

about Filters on php.net

+0

-1 Bitte keinen w3schools link setzen. Setzen Sie stattdessen ein 'php.net' ein und ich gebe Ihnen Ihre Stimme zurück. – think123

+1

+2 gab Ihnen Ihre Stimme zurück, wie garantiert. – think123

+3

Oh und nur für einige Überlegungen warum: http://www.w3fools.com – think123

19

Es gibt keine direkte Entsprechung zu pareseInt() in PHP, weil PHP keinen NaN Datentyp. parseInt() wird NaN produzieren, wenn der Wert nicht analysiert werden kann.

Darüber hinaus hat parseInt() die Radix-Parameter, die keine der PHP-Optionen gibt.

Aber das sagte, wenn alles, was Sie tun wollen einen String in eine ganze Zahl ist zu drehen, dann gibt es mehrere Möglichkeiten:

$int = (int)$string; 

$int = intval($string); 

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

Diese drei werden alle arbeiten in der gleichen Weise. Es kann einige Randfälle geben, bei denen sich intval() von den anderen beiden unterscheidet, aber im Allgemeinen werden sie eine Zeichenkette in einen int verwandeln. In Abwesenheit von NaN geben sie alle 0 (Null) aus, wenn die Zeichenfolge nicht numerisch ist und nicht analysiert werden kann. Dies sollte jedoch für die meisten DB-Sanierungszwecke ausreichen.

Wenn Sie wirklich eine NaN bei einem Fehler möchten, ist die nächste, die Sie erhalten, null. Sie können diese filter_var() mit bekommen:

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

Wenn Sie wollen einfach nur prüfen, ob die Zeichenfolge numerisch ist, die is_numeric() Funktion kann das tun:

$bool = is_numeric($string); 

Aber es gibt true zurück, für Dezimalstellen und auch für wissenschaftliche Notation, so kann für die meisten Situationen nicht perfekt sein.Eine bessere Option ist ctype_digit(), die true zurückgibt, wenn die Zeichenfolge nur aus Ziffern zusammensetzt:

$bool = ctype_digit($string); 

Wenn non e dieser Anzüge, gibt es immer die regex Option ist, preg_match() oder preg_replace() verwenden, aber diese sind auf jeden Fall viel des Guten für diese Art von Szenario.

+0

Verwenden von (int) und intval() sind sehr fehlerfest, aber beachten Sie, dass, wenn die Zeichenfolge eine Fließkommazahl darstellt (dh Dezimalstellen hat) , dann entfernen diese Funktionen einfach, was immer nach dem Punkt kommt. So wird "3.999" zu 3. – Wytze

+0

@Wytze: True, aber die Frage war speziell zu entfernen nicht-stellige Zeichen, so dass die Annahme wäre, dass es keine Dezimalstelle ist. Es gibt andere Optionen, wenn Sie mit Dezimalzahlen umgehen müssen. – Spudley