একটি স্ট্রিং একটি অন্তর্নিহিত, তবে ডাবল নয় ইত্যাদি কীভাবে পরীক্ষা করবেন?


155

পিএইচপি এর একটি intval()ফাংশন রয়েছে যা একটি স্ট্রিংকে একটি পূর্ণসংখ্যায় রূপান্তরিত করে। তবে আমি যাচাই করতে চাই যে স্ট্রিংটি আগে থেকেই একটি পূর্ণসংখ্যা, যাতে আমি ভুল হয়ে থাকলে ব্যবহারকারীকে একটি সহায়ক ত্রুটি বার্তা দিতে পারি। পিএইচপি আছে is_int(), কিন্তু যে স্ট্রিং মত মিথ্যা ফেরত "2"

পিএইচপি এর is_numeric()ফাংশন রয়েছে, তবে এটি সংখ্যাটি দ্বিগুণ হলে সত্য হবে। আমি এমন কিছু চাই যা একটি ডাবলের জন্য মিথ্যা ফিরে আসবে, তবে সত্যিকারের জন্য সত্য।

উদাহরণ:

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

6
"2.0" কীভাবে চিকিত্সা করা উচিত?
নিকফ

উত্তর:


183

কিভাবে ব্যবহার সম্পর্কে ctype_digit?

ম্যানুয়াল থেকে:

<?php
$strings = array('1820.20', '10002', 'wsl!12');
foreach ($strings as $testcase) {
    if (ctype_digit($testcase)) {
        echo "The string $testcase consists of all digits.\n";
    } else {
        echo "The string $testcase does not consist of all digits.\n";
    }
}
?>

উপরের উদাহরণটি আউটপুট দেবে:

স্ট্রিং 1820.20 সমস্ত সংখ্যার সমন্বয়ে গঠিত নয়।
স্ট্রিং 10002 সমস্ত অঙ্ক নিয়ে গঠিত।
স্ট্রিং ডাব্লুএসএল! 12 সমস্ত সংখ্যার সমন্বয়ে গঠিত নয়।

এটি কেবল তখনই কাজ করবে যদি আপনার ইনপুটটি সর্বদা স্ট্রিং থাকে:

$numeric_string = '42';
$integer        = 42;

ctype_digit($numeric_string);  // true
ctype_digit($integer);         // false

আপনার ইনপুট ধরনের হতে পারে তাহলে int, তারপর একত্রিত ctype_digitসঙ্গে is_int

যদি আপনি নেতিবাচক সংখ্যাগুলি সম্পর্কে যত্নশীল হন তবে আপনাকে পূর্বের জন্য ইনপুটটি পরীক্ষা করতে হবে -এবং যদি তা হয় তবে ইনপুট স্ট্রিংয়ের একটিতে কল ctype_digitকরুন substr। এরকম কিছু এটি করবে:

function my_is_int($input) {
  if ($input[0] == '-') {
    return ctype_digit(substr($input, 1));
  }
  return ctype_digit($input);
}

7
নেতিবাচক সংখ্যা?
অনুরাগ

1
@ অনুরাগ, সম্পাদিত (যদিও আপনি যদি সত্যিই এই জিনিসগুলির প্রতি যত্নশীল হন তবে একটি রেজেক্স সম্ভবত সহজতর)।
ডমিনিক রজার

4
আপনাকে নেতিবাচক পূর্ণসংখ্যার জন্য চেক করতে চান, ব্যবহারের যোগ ABS () তাই মত ctype_digit(abs($str))পরিবর্তে শুধু ctype_digit
শে

3
@enchance abs('definitelynotanint') === 0। তদ্ব্যতীত, ctype_digitকেবল স্ট্রিং নেয়
ক্লেসুন

এটি সঠিক নয়। পিএইচপি-তে একটি বড় পূর্ণসংখ্যা ডাবল!
jgmjgm

91

filter_var এটি করা উচিত:

var_dump(filter_var('2', FILTER_VALIDATE_INT));   // 2
var_dump(filter_var('2.0', FILTER_VALIDATE_INT)); // false
var_dump(filter_var('2.1', FILTER_VALIDATE_INT)); // false

কিন্তু

var_dump(filter_var(2, FILTER_VALIDATE_INT));     // 2
var_dump(filter_var(2.0, FILTER_VALIDATE_INT));   // 2
var_dump(filter_var(2.1, FILTER_VALIDATE_INT));   // false

আপনি যদি বুলিয়ানদের রিটার্ন মান হিসাবে চান তবে এটি কোনও ফাংশনে আবদ্ধ করুন, যেমন

function validatesAsInt($number)
{
    $number = filter_var($number, FILTER_VALIDATE_INT);
    return ($number !== FALSE);
}

2
আমি বেশিরভাগ উত্তর পছন্দ করি তবে আমার মনে হয় এটির উত্তরটি সবচেয়ে মার্জিত।
আয়ান ডান

6
@grenoult 3v4l.org/qVRRS স্ট্রিং এবং পূর্ণসংখ্যার জন্য 0 ইন্টি দেয়, সুতরাং আপনি কেন এটি কার্যকর করেন না বলে নিশ্চিত হন না। আপনি ==সম্ভবত ফলাফলের সাথে তুলনা করছেন ?
গর্ডন

1
আমার ভুল @Gordon, আমি প্রকৃতপক্ষে শুধুমাত্র একটি সঙ্গে তুলনা করা হয় if 3v4l.org/IAvCF
Guillaume, Renoult

এটি কিছু অদ্ভুত কাজ করবে যেমন "+123" এর সত্য হিসাবে প্রত্যাবর্তন। এটি দ্বারা প্রকৃতপক্ষে ফিরে আসা বোঝানো হয়েছে তবে এটি এখনও লোকেরা যা চায় তা নাও হতে পারে যা একটি কঠোর ইনট চেক।
jgmjgm

@ মোহাম্মদআরদাউআসসিনি ওপি ভাসমান নয়, স্ট্রিংকে বৈধতা দিতে বলেছে । এটা তোলে হবে যদি আপনি '-1,0' থেকে (ক STRING) পাস কাজ এটা হবে না যদি আপনি -1,0 (ক ভাসা) পাস কাজ, কিন্তু যে প্রয়োজন দিয়ে শুরু ছিল না। 3v4l.org/bOX6X
গর্ডন

20

ডমিনিকের উত্তর (ব্যবহার করে ctype_digit) +1 করুন । আপনি এটি করতে পারেন এমন অন্য উপায়টি হ'ল জবরদস্তি সহ:

$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

2
আপনাকেও +1 (যদিও আমি ভাবছি যে ইনপুট স্ট্রিংটি ছাঁটাই করে যদি সেই নির্দিষ্ট কেসটি আরও স্পষ্টভাবে পরিচালিত হয়)।
ডমিনিক রজার

6
এই পদ্ধতিটি অ-সংখ্যাসূচক স্ট্রিংয়ের জন্য কাজ করে না: is_int ("abc" +0) সত্য
কাই পোমারেঙ্কে

1
সত্য, এটি অ-সংখ্যাসূচক স্ট্রিংয়ের জন্য কাজ করে না ... কী সম্পর্কে is_int($inty + 0) && is_numeric($inty)(আমি জানি এটি একটি অলস সমাধান তবে বেশিরভাগ উদ্দেশ্য এবং উদ্দেশ্যগুলির জন্য কাজ করে ...
অ্যালেক্স মান্টাউট

প্রকারের জগিং ব্যবহারের ফলে বেশ looseিলে checkingালা যাচাই করা যাবে যেখানে সমস্ত ধরণের স্ট্রিং উপায়ে ইনটগুলি উপস্থাপন করা যেতে পারে, এটি স্ট্রিং চেক নয়। আপনারও +0 করার দরকার নেই। আপনি সহজভাবে + $ var করতে পারেন।
jgmjgm

13

এটি পূর্বে কাস্ট করুন। যদি এখনও তার মান একই থাকে;

function my_is_int($var) {
  $tmp = (int) $var;
  if($tmp == $var)
       return true;
  else
       return false;
}

2
বা আরও ছোট:return $var == (int) $var;
আল.জি.

1
@ AI.G। কাস্ট ব্যর্থ হলে কী হয়
ডিআর।

এটি খুব কাছাকাছি, প্রয়োজন না হলেও টাইপ জাগলিং এড়ানো উচিত। $ Var "123xxxx" হলে এটি কাজ করবে।
jgmjgm

8
/**
 * 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;
    if (is_string($data) === true && is_numeric($data) === true) {
        return (strpos($data, '.') === false);
    }
}

উত্স


অল্প ইউটিলিটি ফাংশন সহ আমার কোডটি ছড়িয়ে দেওয়ার পরিবর্তে আমার কাছে এমন কিছু ছিল যা পিএইচপি তে অন্তর্নির্মিত।
ররি

আমি এই হ্যাকগুলি পছন্দ করি না। তবে এই পদ্ধতির ব্যবহার বা ডোমিনিকের সিটিপি পরামর্শ ব্যবহার করে, আপনি কোনও পদ্ধতিতে যে কোনও উপায়ে সমস্ত বাস্তবায়ন সজ্জিত করতে চলেছেন। পিএইচপি ব্যবহার করার সময়, এই সমস্যাগুলি সমাধান করার জন্য আমার সর্বদা একটি "ইউটিল" শ্রেণি থাকে।
GmonC

elseifকেবল ifকারণ এটি ইতিমধ্যে উপরে বিবৃতিতে ফিরে এসেছেন।
rybo111

এছাড়াও শেষে মিথ্যা ফেরার দরকার নেই।
rybo111

1
যদি $dataকোনও বস্তু হয় তবে এটি ফিরে আসবে null। ভাল আছে return false;শেষে।
থিওডোর আর স্মিথ

6

is_intসম্প্রতি একটি শক্তিশালী প্রয়োজন ছিল । আমি অবধারিত ()টিকে খুব অনির্দেশ্য বলে মনে করেছি:

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


পিএইচপি ডকুমেন্টেশন মন্তব্যে এই স্নিপেটটি জুড়ে এসেছিল এবং এটি পরীক্ষা করার পরে এটি আপনাকে ফেলে দেওয়া প্রায় সমস্ত কিছুই কভার করে:

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


তবে সাবধান:

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

6

একটি সত্যই পরিষ্কার উপায় যা আমি ব্যবহার করতে পছন্দ করি তা হ'ল। আপনি এটি দু'বার কাস্ট করেছেন, প্রথমে ইন int, দ্বিতীয়ত string, তারপরে আপনি কঠোরভাবে তুলনা করুন ===। নীচের উদাহরণটি দেখুন:

$value === (string)(int)$value;

এখন, আপনার ফাংশন my_is_int সম্পর্কে, আপনি এর মতো কিছু করতে পারেন:

function my_is_int($value){ return $value === (string)(int)$value; }
my_is_int('2');  // true
my_is_int('2.1') // false

4
function my_is_int($var) {
    return preg_match('/^\d+$/', $var);
}

1
আমি সংখ্যার সংকেতকে '/^[-+]?[0-9]+$/'
মঞ্জুরি

এটি সিটিপি_ডিজিটের সমান, এটি একটি পিছনে থাকা নতুন লাইনেরও অনুমতি দেয়।
jgmjgm

3

আমি এটি ব্যবহার করছি:

function isInt($val){

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

}

var_dump (isInt("1"));

3

আপনি কেবল একটি সংখ্যার জন্য যাচাই করতে পারেন, যদি এটি হয় তবে কাস্টিংয়ের চেয়ে দ্বিগুণ দেওয়া হয় কিনা তা পরীক্ষা করে দেখুন:

((is_numeric($var) && !is_double(1*$var)));

কেবল ধনাত্মক সংখ্যার জন্য:

(is_numeric($var) && !is_double(1*$var)) && ($var >= 0)

এটি পরীক্ষা করা হচ্ছে:

$numbersToCheck = array("a", "-1", "1", "1.0", "1.2");

foreach ($numbersToCheck as $var) {
    echo $var . " is integer? ";var_dump((is_numeric($var) && !is_double(1*$var)));

    echo $var . " is a positive integer? ";var_dump((is_numeric($var) && !is_double(1*$var)) && ($var >= 0));
}

আউটপুট:

a is integer? bool(false)
a is a positive integer? bool(false)
-1 is integer? bool(true)
-1 is a positive integer? bool(false)
1 is integer? bool(true)
1 is a positive integer? bool(true)
1.0 is integer? bool(false)
1.0 is a positive integer? bool(false)
1.2 is integer? bool(false)
1.2 is a positive integer? bool(false)

is_numeric () যা আমি খুঁজছিলাম।
ccjjmartin

1
আপনি যা চান তা নিশ্চিত হওয়ার জন্য, আপনাকে পিএইচপি উত্সটি পড়তে হবে কারণ এটি নথিবদ্ধ নয়। উদাহরণস্বরূপ, is_numeric অগ্রণী হোয়াইটস্পেস গ্রহণ করে, যা পিএইচপি ম্যানুয়ালটিতে নথিবদ্ধ কিছু নয়। আপনার এও মনে রাখা উচিত যে স্ট্রিং পূর্ণসংখ্যাগুলি যেগুলি খুব বড় একটি স্থানীয় নেটের সাথে উপস্থাপিত হয় তা ফ্লোতে রূপান্তরিত হয়।
jgmjgm

2

এটা চেষ্টা কর:

$string='12abc';
if ((int)$string==$string) var_dump((int)$string); else echo 'Invalid!';
// Outputs: Invalid!

$string='789';
if ((int)$string==$string) var_dump((int)$string); else echo 'Invalid!';
// Outputs: int 789

$string='345.00';
if ((int)$string==$string) var_dump((int)$string); else echo 'Invalid!';
// Outputs: 345

$string='123.01';
if ((int)$string==$string) var_dump((int)$string); else echo 'Invalid!';
// Outputs: Invalid!

আপনার স্ট্রিংয়ের দশমিক স্থান থাকলে তাও কাজ করে


এটি 123XXX কে একটি বৈধ ইন্ট স্ট্রিং হিসাবে বিবেচনা করবে।
jgmjgm

2

এটি পাশাপাশি নেতিবাচক সংখ্যা যত্ন নেবে

function myIsInt()
{
   return (is_numeric($var) AND (is_int($var) OR ctype_digit(trim($var, '-'))))
}
//'234-' => false
//'-234' => true
//'--234' => false
//'234' => true

আমি বুঝতে পারছি না কেন এটি 234- বা --234 এর জন্য মিথ্যা ফিরে আসবে, আপনি এটি পরীক্ষা করেছেন? এটি ----- 1234 ----
jgmjgm


2

আমি এমন কোনও উপায় তৈরি করেছি যাতে আমি কোথাও খুঁজে পাচ্ছি না, তাই আমি এটি এখানে রাখছি:

আরও অ্যাডো ছাড়া এটি এটি: ctype_digit((string) abs($input))

উদাহরণ:

function means_int($input) {
    return ctype_digit((string) abs($input));
}

$list = array(
    0,
    '0',
    1,
    '1',
    1.1,
    '1.1',
    2.0,
    '2.0',  
    2.6,
    '2.6',
    -4,
    '-4',   
    -3.2,
    '-3.2',
    -30.02,
    '-30.02',   
    100.00,
    '100.00',   
);

foreach ($list as $x) {
    var_dump($x);
    var_dump(means_int($x));
    echo PHP_EOL;
}

ফলাফল: (প্রত্যাশার মতো, আমি মনে করি)

int(0)
bool(true)

string(1) "0"
bool(true)

int(1)
bool(true)

string(1) "1"
bool(true)

float(1.1)
bool(false)

string(3) "1.1"
bool(false)

float(2)
bool(true)

string(3) "2.0"
bool(true)

float(2.6)
bool(false)

string(3) "2.6"
bool(false)

int(-4)
bool(true)

string(2) "-4"
bool(true)

float(-3.2)
bool(false)

string(4) "-3.2"
bool(false)

float(-30.02)
bool(false)

string(6) "-30.02"
bool(false)

float(100)
bool(true)

string(6) "100.00"
bool(true)

অ্যাবস স্ট্রিং থেকে অঙ্ক পর্যন্ত ইনপুট কাস্ট করছে। এটি is_int (+ $ var) এর মতো।
jgmjgm

2

এটি করার সবচেয়ে পারফরম্যান্স উপায় নাও হতে পারে। তবে আপনি এটি এক লাইনে লিখতে পারেন।

function my_is_int($input) {
    return intval($input).'' === $input.'';
}

প্রত্যাশিত:

    my_is_int(1);     // TRUE
    my_is_int(-1);    // TRUE
    my_is_int(1.2);   // FALSE
    my_is_int("1");   // TRUE
    my_is_int("-1");  // TRUE
    my_is_int("1.2"); // FALSE
    my_is_int(0);     // TRUE
    my_is_int(null);  // FALSE

gotcha:

    my_is_int(1.0);   // TRUE
    my_is_int("1.0"); // FALSE

এইটি সঠিক, যতক্ষণ আপনি নিশ্চিত হন $ ইনপুট টাইপ স্ট্রিংয়ের।
jgmjgm

2

কয়েক বছর দেরীতে, তবে এখানে দেওয়া উত্তরের উপর ভিত্তি করে আমি এমন একটি সমাধান নিয়ে এসেছি যা অন্যান্য উত্তরগুলির তুলনায় কিছুটা বেশি নির্ভুল (বিশেষত বুলিয়ানদের উপর) এবং আরও দক্ষ (আমার মনে হয়):

function my_is_int($s) {
    return ctype_digit($s) || is_int($s);
}

এগুলির জন্য প্রত্যাশা অনুযায়ী কাজ করা:

my_is_int(2);                   // true
my_is_int("2");                 // true
my_is_int(-2);                  // true
my_is_int(2.0);                 // false
my_is_int("2.0");               // false
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
my_is_int(true);                // false
my_is_int(false);               // false
my_is_int("true");              // false
my_is_int("false");             // false
my_is_int("0x101010");          // false

এই 2 বাদে সম্ভবত:

my_is_int(0x101010);            // true
my_is_int("-2");                // false

খুব সুন্দর. যদি আপনি সংখ্যার স্ট্রিংটিকে নেতিবাচক চিহ্ন দিয়ে পরিচালনা করতে চেয়েছিলেন তবে আপনি সিটিপি_ ডিজিটস (প্রিগ_রেপ্লেস ('/ ^ - /', '', '' গুলি)) তে পরিবর্তন করতে পারেন, যদিও এটি কিছুটা দীর্ঘ-বায়ু পেতে শুরু করে। এছাড়াও, 0x101010 একটি অন্তর্নিহিত, সুতরাং এটি ত্রুটি নয়, বরং "0x101010" ভুল হিসাবে বিবেচিত হতে পারে, এবং আমি নিশ্চিত বাইনারি স্ট্রিংগুলি বাইনারি আক্ষরিক স্বরলিপি ("0 বি 11111") এর সাথে মিলে যাওয়াও ব্যর্থ হবে
fbas

1

কেমন:

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

এই ফাংশনটি কেবল এমন কোনও স্ট্রিং নম্বরের জন্যই সত্য প্রত্যাবর্তন করতে পারে যা দিয়ে (int)বা এর সাথে পূর্বে কাস্ট করা যায়intval()গাণিতিক তাত্পর্যপূর্ণ নয় এমন জিনিস গ্রহণ করার সময় এই গাণিতিক গাণিতিক তাত্পর্য (যেমন পিএইচপি এর পূর্ণসংখ্যার পরিসরের বাইরে দশমিক বিন্দুর পরে নন-জিরোস) কিছু না হারাতে (যেমন শ্বেত স্পেস; শীর্ষস্থানীয় জিরো; বা দশমিক বিন্দুর পরে একচেটিয়াভাবে জিরো)।

এটি মিথ্যা ফিরবে '10.'তবে এর জন্য নয় '10.0'। আপনি যদি '10.'সত্য হতে চেয়েছিলেন তবে আপনি নিয়মিত প্রকাশের +পরে এর পরিবর্তন করতে 0পারেন *


1

এখানে আমি ব্যবহার করেছি এমন কিছু কোড যা ভালভাবে কাজ করছে বলে মনে হয় এবং অন্যদের মতো যে কোনও সমস্যা নেই।

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

এটি অর্ডার ইত্যাদি পরীক্ষা করে না তাই এটি নেতিবাচক পূর্ণসংখ্যার জন্য নয় বরং কিছু সংযোজন কোড সহ যা উপরে থেকে অন্যান্য কিছু ধারণাগুলি ব্যবহার করে করা যেতে পারে। এটি বাইনারি array('0', '1')বা হেক্সাডেসিমাল ইত্যাদির সাথেও কাজ করতে খাপ খাইয়ে নেওয়া যেতে পারে etc.


এটি কেবলমাত্র একটি ব্যয়বহুল সিটি টাইপ_ডিজিট।
jgmjgm

1

এটা দেখ. $ ভালকে পূর্ণসংখ্যায় রূপান্তর করে এবং তারপরে স্ট্রিনে রূপান্তরিত আসল converted ভালটি আইডেন্টিকাল (===) হয় কিনা - ঠিক == প্রত্যাশার মতো কাজ করবে না - স্ট্রিংয়ে রূপান্তরিত পূর্ণসংখ্যক ভ্যালিতে to

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

আপনি যদি স্ট্রিংয়ের মানগুলি পরীক্ষা করে না থাকেন তবে এটি আপনার প্রত্যাশার মতো কাজ করবে না:

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

আউটপুট:

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.

আপনি হেক্স (0x101010), অক্টাল (01) বা একটি পূর্ণসংখ্যার ভাসা (1.0, 0.0) হিসাবে সঞ্চয় করা ব্যবহার করার পরেও অভ্যন্তরীণভাবে সমস্ত ফ্লোট হিসাবে সঞ্চিত থাকে Re তবে, আপনি যদি স্ট্রিং হিসাবে সঞ্চিত ইন্টি পরীক্ষা করতে ফাংশনটি ব্যবহার করেন তবে এটি কাজ করবে।


1
public static function isNumeric($value, $negativ = false) {
    return is_int($value) || is_string($value) && (
        ctype_digit($value) || (
            $negativ && $value{0} == '-' && ctype_digit(substr($value, 1))
        )
    );

    //alternativ:
    //return $value == (int) $value;
}

এটিতে একটি চেকটি পাওয়া যাচ্ছে না! == ''। আপনি যদি এটিতে একটি দীর্ঘ দীর্ঘ পূর্ণসংখ্যা স্থাপন করেন তবে এটি পিএইচপি কোনও ফ্লোটে ফেলে দেওয়া কোনও কিছুর জন্য সত্যও ফিরে আসবে!
jgmjgm

1

আপনি নিম্নলিখিত শর্তটি ব্যবহার করতে পারেন। লক্ষ্য করুন যে আপনার ব্যবহার করা উচিত নয়! ==

$value = 12; // true
$value = '12'; // true
$value = 'abc'; // false
$value = 12.1; // false
$value = '12.1'; // false

if (!is_numeric($value) || (int) $value != (float) $value) {
    echo "false";
} else {
    echo "true";
}

1

এটি পুরোপুরি কাজ করে! আশা করি এটি আপনার পক্ষে সহায়ক হবে =)

$value = 1; // true
$value = '1'; // true
$value = '1.0'; // true
$value = ' 1'; // true
$value = '01'; // true

$value = -1; // true
$value = '-1'; // true
$value = '-1.0'; // true
$value = ' -1'; // true
$value = '-01'; // true

$value = PHP_INT_MIN; // true
$value = PHP_INT_MAX; // true
$value = 0x000001; // true

$value = 'a'; // false
$value = '1a'; // false
$value = 'a1'; // false
$value = 1.1; // false
$value = '1.1'; // false
$value = '--1'; // false
$value = []; // false
$value = [1,2]; // false
$value = true; // false
$value = false; // false
$value = null; // false
$value = 'NaN'; // false
$value = 'undefined'; // false

function isInt($value) {
    return is_numeric($value) && floatval(intval($value)) === floatval($value);
}

1
কোনও পুরানো প্রশ্নের উত্তর দেওয়ার সময়, অন্য উত্তর স্ট্যাকওভারফ্লো ব্যবহারকারীদের কাছে আপনার উত্তরটি আরও কার্যকর হবে যদি আপনি নিজের উত্তর কীভাবে সহায়তা করে তা ব্যাখ্যা করার জন্য কিছু প্রসঙ্গ অন্তর্ভুক্ত করে, বিশেষত ইতিমধ্যে স্বীকৃত উত্তর রয়েছে এমন একটি প্রশ্নের জন্য। দেখুন: আমি কীভাবে ভাল উত্তর লিখব
ডেভিড বাক

0

আপনি যদি সত্যই জানতে চান যে কোনও স্ট্রিং সত্য পিএইচপি পূর্ণসংখ্যার ধরণের বৈধ উপস্থাপনা কিনা ...

in_array($string, array_map('strval', range(PHP_INT_MIN, PHP_INT_MAX)), true)

তবে সেটটি খুব বড় হওয়ায় এটি চালানো অসম্ভব (এই ক্ষেত্রে মেমরির সাথে খাপ খায় না, পরিবর্তে লুপ করলে এটি অনেক বেশি সিপিইউ চক্র গ্রহণ করবে)।

আপনি সম্ভবত স্ট্রিং তুলনা সঙ্গে একটি বাইনারি অনুসন্ধান করতে পারেন, তবে আরও ভাল উপায় আছে।

সরল সত্তা:

strlen($string) <= max(strlen((string)PHP_INT_MIN), strlen((string)PHP_INT_MAX)) && $string === (string)(int)$string

এটির কাছে যাওয়ার আরও কিছু অস্বাভাবিক উপায় রয়েছে যেমন:

is_int(array_keys([$string => null])[0])

আপনি স্ট্রিং তুলনাও করতে পারেন তবে আপনাকে এখনও সিটিপি_ডিজিটের মতো কাজগুলি করতে হবে, দৈর্ঘ্যটি যুক্তিসঙ্গত কিনা তা পরীক্ষা করুন (সিটিপি_ডিজিটের মতো কাজ করার আগে সিপিইউ নষ্ট করবেন না) এবং নেতিবাচক সংখ্যার জন্য কিছু বিশ্রী হ্যান্ডলিং করতে হবে।

নোট করুন যে ফিল্টার_ভার সঠিকভাবে জোর দেয় না যে কোনও স্ট্রিং প্রকৃতপক্ষে কোনও পিএইচপি পূর্ণসংখ্যার উপস্থাপনা। এটি নেতৃস্থানীয় + এবং আশেপাশের সাদা স্থানকে অনুমতি দেবে।

অভ্যন্তরীণভাবে পিএইচপি কঠোর তুলনার জন্য "_zend_handle_numeric_str" ফাংশনটি ব্যবহার করে তবে এটি এটিকে সরাসরি কোথাও প্রকাশ করে না, সুতরাং অ্যারের কীগুলি ব্যবহার করে কৌশল (যা কোনও পিএইচপি পূর্ণসংখ্যার পিএইচপি পূর্ণসংখ্যার প্রতিনিধিত্ব করে এমন কোনও স্ট্রিং রূপান্তর করতে এটি ব্যবহার করে)।

আপনি যদি পিএইচপি থেকে এবং বাইনারি সুরক্ষিত রূপান্তর চান তবে এটি গ্রহণ করার পদ্ধতি।

প্রত্যেকে এটি পছন্দ করতে পারে না এবং এটি ব্যবহারকারীর ইনপুট হ্যান্ডেল করার ক্ষেত্রে হতে পারে। ফিল্টার_ভার এর পক্ষে খুব খারাপ নয় এবং পিএইচপি-তে নতুন নতুন ব্যক্তিদের পক্ষে বেশিরভাগ ক্ষেত্রেই মোটামুটি নিরাপদে থাকবে।

একটি দৈর্ঘ্যের চেক, সিটিপাইডিজিট এবং তারপরে রূপান্তরিত মানের একটি চেক যা এটি একটি পরিসরের মধ্যে রয়েছে তাও ব্যবহারকারী ইনপুটটির জন্য যথেষ্ট শক্ত। আরও জটিল স্কিমগুলি ছাঁটাই বা রেজেেক্স চাইবে।

সেই বিষয়ে এখানে প্রচুর উত্তর নিয়ে সমস্যাটি হ'ল প্রশ্নটি অস্পষ্ট হওয়ার পরেও উত্তরগুলি হওয়া উচিত নয়। আপনি যদি কোনও সমাধান প্রস্তাব করতে চলেছেন তবে এটির ঠিক কী হবে তা আপনি ব্যাখ্যা করতে সক্ষম হবেন এবং আশা করবেন না। এটি ছাড়া কোনও উত্তর কোনও প্রশ্নের সাথে মেলে বা নিরাপদ কিনা তা বলার অপেক্ষা রাখে না। পিএইচপি ম্যানুয়াল সর্বদা সহায়তা করে না কারণ এটি সরবরাহ করা প্রতিটি প্রাসঙ্গিক পদ্ধতির জন্য সমস্ত ক্যাভেটকে ব্যাখ্যা করে না। সিটিপি_ডিজিট এবং ইস_িন্টের মতো বিষয়গুলি খুব নির্ভরযোগ্য এবং ভবিষ্যদ্বাণী করা সহজ তবে ইস_নামারিক, ফিল্টার_ভার এবং জাগলিং (+ $ ভ্যার) বা ingালাই (ইনভ্যাল / ফ্লোটওয়াল) এর সুনির্দিষ্ট দস্তাবেজগুলি নেই।

এটি আপনার জন্য পিএইচপি fudge। এটিতে অসঙ্গতি সহ স্ট্রিংটিকে পূর্ণসংখ্যা হিসাবে ব্যাখ্যা করার জন্য একটি অজস্র স্কিমাস রয়েছে। একটি পূর্ণসংখ্যার স্ট্রিং যাচাইয়ের সবচেয়ে কড়া পদ্ধতিটি সরাসরি ব্যবহারকারীর সামনে প্রকাশিত হয় না।


0

আপনি যদি মাইএসকিএল থেকে সংখ্যাসূচক আইডিগুলি পরিচালনা করছেন এবং এটির জন্য একটি বৈধ নন শূন্য ইন্ট বা একটি intতবে স্ট্রিং ফর্ম্যাটে ( যেমন মাইএসকিএল সর্বদা স্ট্রিং বিন্যাসে সমস্ত কিছু ফিরিয়ে দেয় ) হওয়ার জন্য বৈধতা আরোপের চেষ্টা করছেন NULL। আপনি নিম্নলিখিত ব্যবহার করতে পারেন। এটি কেবলমাত্র int/string-intsআমি খুঁজে পেয়েছি যা অনুমতি দেয় এটি সবচেয়ে ত্রুটি / সতর্কতা / নোটিশ প্রমাণ উপায় ।

...
if(empty($id) || !is_scalar($id) || !ctype_digit($id)){
  throw("Invalid ID");
}
...

0

এখানে একটি সাধারণ সমাধান যা_সংখ্যক , ভাসমানঅন্তর্নিহিত ব্যবহার করে :

function is_string_an_int($string)
{
    if (is_string($string) === false)
    {
        //throw some kind of error, if needed
    }

    if (is_numeric($string) === false || floatval(intval($string)) !== floatval($string))
    {
        return false;
    }

    else
    {
        return true;
    }
}

ফলাফল:

is_string_an_int('-1'); //true
is_string_an_int('-1.0'); //true
is_string_an_int('-1.1'); //false
is_string_an_int('0'); //true
is_string_an_int('0.0'); //true
is_string_an_int('0.1'); //false
is_string_an_int('1'); //true
is_string_an_int('1.0'); //true
is_string_an_int('1.1'); //false
is_string_an_int('' . PHP_INT_MAX); //true
is_string_an_int('foobar'); //false
is_string_an_int('NaN'); //false
is_string_an_int('null'); //false
is_string_an_int('undefined'); //false

নোট করুন যে PHP_INT_MAX এর চেয়ে বড় মানগুলি মিথ্যা ফিরে আসতে পারে।


-1

হয় হয়_সংখ্যক () ব্যবহার করতে পারে তারপরে "উপস্থিতি পরীক্ষা করে দেখুন"। স্ট্রিং (যদিও বিশেষত সংস্কৃতি সংবেদনশীল নয়)।

বিকল্পভাবে is_numeric () ব্যবহার করুন তারপরে একটি ডাবলকে কাস্ট করুন এবং দেখুন $ var == তল ($ ভ্যার) (এটি পূর্ণসংখ্যা হলে সত্য হওয়া উচিত)।


এই একমাত্র উত্তর যা লোকেল পরিবর্তনের স্বীকৃতি দেয় তা পিএইচপি কীভাবে সংখ্যার ব্যাখ্যা করে এবং আউটপুট দেয় তাও পরিবর্তন করে। সেটলোকেল এবং সমাধানগুলি যা বিভাজক সম্পর্কে ধারণা তৈরি করে সে সম্পর্কে খুব সতর্ক থাকুন।
jgmjgm
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.