Nasıl bir dize bir int, ama bir çift değil, vb kontrol etmek?

10 Cevap php

PHP bir tamsayı bir dize dönüştürmek olacak bir intval() işlevi vardır. Ancak ben yanlış bir şey varsa ben kullanıcıya yardımcı hata mesajı verebilir böylece dize, önceden bir tamsayı olduğunu kontrol etmek istiyorum. PHP is_int() var, ama bu "2" gibi bir dize için false döndürür.

PHP is_numeric() işlevi vardır, ama sayı bir çift ise bu doğru dönecektir. Ben bir int için bir çift, ama gerçek için return false şey istiyorum.

örneğin:

my_is_int("2") == TRUE
my_is_int("2.1") == FALSE

10 Cevap

Dominic cevap +1 kullanarak (ctype_digit). Bunu yapabileceği başka bir yolu tipi zorlama ile:

$inty = "2";
$inty2 = " 2";
$floaty = "2.1";
$floaty2 = "2.0";

is_int($inty + 0); // true
is_int($floaty + 0); // false
is_int($floaty2 + 0); // false

// here's difference between this and the ctype functions.
is_int($inty2 + 0);  // true
ctype_digit($inty2); // false
/**
 * Check if a number is a counting number by checking if it
 * is an integer primitive type, or if the string represents
 * an integer as a string
 */
function is_int_val($data) {
    if (is_int($data) === true) return true;
    elseif (is_string($data) === true && is_numeric($data) === true) {
        return (strpos($data, '.') === false);
    } 
    return false;
}

Source.

Yakın zamanda sağlam bir is_int için bir ihtiyaç vardı. Ben de öngörülemeyen () intval bulundu:

intval(array('foo', 'bar')) //returns 1 ?!?
intval("2dog") //returns 2 even though the value is definitely not an integer
intval("dog2") //also returns 2


Came across this snippet in the PHP documentation comments, and after testing it, it covers almost everything you throw at it:

function my_is_int($s) {
    return (is_numeric($s) ? intval($s) == $s : false);
}


my_is_int(2); //true
my_is_int("2"); //true
my_is_int(2.1); //false
my_is_int("2.1"); //false
my_is_int("dog"); //false
my_is_int("2dog"); //false
my_is_int("dog2"); //false
my_is_int(array('foo', 'bar')); //false
my_is_int(array(1)); //false


Ama dikkatli olun:

my_is_int(2.0); //true
my_is_int("2.0"); //true

Ben bunu kullanıyorum:

function isInt($val){

    return (filter_var($val, FILTER_VALIDATE_INT) !== false && strpos($val, '-') === false);

}

var_dump (isInt("1"));

) Sonra varlığını kontrol (is_numeric kullanabilir miyim ya "." dizesinde (değil, özellikle kültür-duyarlı olsa).

Alternatif is_numeric kullanın () daha sonra bir çift için döküm ve $ var == kat ($ var) eğer (bir tamsayı ise true dönmelidir) bkz.

Nasıl hakkında:

function isIntStr($str) {
   return preg_match('/^(-?\d+)(?:\.0+)?$/', trim($str), $ms)
       && bcComp($ms[1], PHP_INT_MAX) <= 0
       && bcComp($ms[1], -PHP_INT_MAX - 1) >= 0;
}

Bu fonksiyon sadece (örneğin non-sıfır ondalık nokta veya dışında sayılardan sonra matematik önemi hiçbir şey kaybetmeden (int) veya intval() ile int atamaxs herhangi bir dize dizi için de geçerlidir dönmelidir PHP'nin tamsayı aralığında) matematiksel gibi boşluk olarak (önemli olmayan şeyleri kabul ederken, önde gelen sıfırları veya, ondalık noktadan sonra, sıfırlar sadece).

Bu '10.' fakat '10.0' için için false dönecektir. Eğer '10.' gerçek olmasını istedik eğer * için düzenli ifadede 0 sonra + değiştirebilir.

Burada iyi çalışmak ve görünüyor ben kullandım bazı kod diğerlerinden çok yapmak bu konularda herhangi yoktur.

if (0 != strlen(str_replace(range(0, 9), '', $TestInt))) { print 'Not an integer!';}

Bu düzeni vb kadar negatif tamsayılar için bir anlamı olmadığını kontrol ama yukarıdan diğer bazı fikirleri kullanarak da yapılabilir bazı ekleme kodu ile. Değil Ayrıca, ikili-array('0', '1'), onaltılık de vb çalışmak için adapte edilebilir

Bu bakın. Orijinal $ val dizeye dönüştürülür eğer kontrolleri tamsayı ve $ val dönüştürür (===) aynıdır - beklendiği gibi sadece == çalışmaz - val dizeye dönüştürülür tamsayı.

function validInt($val, $min=null, $max=null) {
    $ival = intval($val);
    //echo "'$ival' '$val'<br>\n"; // Uncomment to see the comparisons done in below if block
    if(''.$ival !== ''.$val) {
        return false;
    }
    if($min !== null && $ival < $min)
        return false;
    if($max !== null && $ival > $max)
        return false;
    return true;
}

Eğer dize değerlerini kontrol etmezseniz size beklediğiniz gibi çalışmayabilir:

$nums = array(
    '1',
    '+1',
    '-1',
    '01',
    '1.0',
    '.0',
    '1.123',
    'a123',
    '0x101010',
    1,
    -1,
    01,
    1.0,
    .0,
    1.123,
    0x101010,
);
foreach($nums as $num) {
    if(validInt2($num))
        echo $num." - Valid integer.<br>\n";
    else
        echo $num." - Not a valid integer.<br>\n";
}

Çıktı:

1 - Valid integer.
+1 - Not a valid integer.
-1 - Valid integer.
01 - Not a valid integer.
1.0 - Not a valid integer.
.0 - Not a valid integer.
1.123 - Not a valid integer.
a123 - Not a valid integer.
0x101010 - Not a valid integer.
1 - Valid integer.
-1 - Valid integer.
1 - Valid integer.
1 - Valid integer.
0 - Valid integer.
1.123 - Not a valid integer.
1052688 - Valid integer.

Eğer hex (0x101010) kullansanız bile varlık sebebi, sekizli (01) veya şamandıra (1.0, 0.0) olarak depolanan bir tamsayı, dahili tüm float olarak saklanır. Bir dize olarak depolanan int denetlemek için işlevini kullanın Ancak, bu iş olacak.