validation العمليات - هل توجد طريقة(مضمنة)في JavaScript للتحقق مما إذا كانت السلسلة رقم صحيح؟




اساسيات بالعربي (18)

أنا على أمل وجود شيء في نفس الفضاء المفاهيمي كدالة VB6 IsNumeric () القديمة؟


Answers

إذا كنت تحاول فقط التحقق مما إذا كانت السلسلة عبارة عن رقم صحيح (لا توجد منازل عشرية) ، فإن regex هي طريقة جيدة للانطلاق. الطرق الأخرى مثل isNaN معقدة للغاية لشيء بسيط جدا.

function isNumeric(value) {
    return /^-{0,1}\d+$/.test(value);
}

console.log(isNumeric('abcd'));         // false
console.log(isNumeric('123a'));         // false
console.log(isNumeric('1'));            // true
console.log(isNumeric('1234567890'));   // true
console.log(isNumeric('-23'));          // true
console.log(isNumeric(1234));           // true
console.log(isNumeric('123.4'));        // false
console.log(isNumeric(''));             // false
console.log(isNumeric(undefined));      // false
console.log(isNumeric(null));           // false

للسماح فقط للأرقام الصحيحة الإيجابية ، استخدم هذا:

function isNumeric(value) {
    return /^\d+$/.test(value);
}

console.log(isNumeric('123'));          // true
console.log(isNumeric('-23'));          // false

اقتبس:

isNaN (num) // بإرجاع true إذا كان المتغير لا يحتوي على رقم صالح

ليس صحيحًا تمامًا إذا احتجت إلى التحقق من وجود مسافات رائدة / لاحقة - على سبيل المثال عند الحاجة إلى كمية معينة من الأرقام ، وتحتاج إلى الحصول على ، على سبيل المثال ، "1111" وليس "111" أو "111" لرمز PIN ربما إدخال.

من الأفضل استخدام:

var num = /^\d+$/.test(num)

بلدي الحل:

// returns true for positive ints; 
// no scientific notation, hexadecimals or floating point dots

var isPositiveInt = function(str) { 
   var result = true, chr;
   for (var i = 0, n = str.length; i < n; i++) {
       chr = str.charAt(i);
       if ((chr < "0" || chr > "9") && chr != ",") { //not digit or thousands separator
         result = false;
         break;
       };
       if (i == 0 && (chr == "0" || chr == ",")) {  //should not start with 0 or ,
         result = false;
         break;
       };
   };
   return result;
 };

يمكنك إضافة شروط إضافية داخل الحلقة ، لتناسب احتياجاتك الخاصة.


إليك أحد الخطوط لمعرفة ما إذا كانت sNum قيمة رقمية صحيحة ؛ تم اختباره لمجموعة متنوعة من المدخلات:

!isNaN(+s.replace(/\s|\$/g, ''));  // returns True if numeric value

لماذا لا يكون تنفيذ jQuery جيدًا بما فيه الكفاية؟

function isNumeric(a) {
    var b = a && a.toString();
    return !$.isArray(a) && b - parseFloat(b) + 1 >= 0;
};

اقترح مايكل شيئًا مثل هذا (على الرغم من أنني قد سرقت "الإصدار 16161651 - جون" المستخدم هنا):

function isNumeric(num){
    num = "" + num; //coerce num to be a string
    return !isNaN(num) && !isNaN(parseFloat(num));
}

ما يلي هو الحل مع أداء سيئ على الأرجح ، ولكن النتائج الصلبة. إنها عبارة عن أداة مصنوعة من تطبيق jQuery 1.12.4 وإجابة مايكل ، مع فحص إضافي للمسافات الزائدة / الرائدة (لأن إصدار مايكل يرجع حقيقة للعددات ذات المسافات الرائدة / الزائدة):

function isNumeric(a) {
    var str = a + "";
    var b = a && a.toString();
    return !$.isArray(a) && b - parseFloat(b) + 1 >= 0 &&
           !/^\s+|\s+$/g.test(str) &&
           !isNaN(str) && !isNaN(parseFloat(str));
};

يحتوي الإصدار الأخير على متغيرين جديدين. يمكن للمرء أن يحصل على واحدة من هذه ، عن طريق القيام:

function isNumeric(a) {
    if ($.isArray(a)) return false;
    var b = a && a.toString();
    a = a + "";
    return b - parseFloat(b) + 1 >= 0 &&
            !/^\s+|\s+$/g.test(a) &&
            !isNaN(a) && !isNaN(parseFloat(a));
};

لم أختبر أيًا من هذه الأشياء كثيرًا ، بوسائل أخرى غير الاختبار اليدوي لحالات الاستخدام القليلة التي سأصاب بها في مأزقاتي الحالية ، والتي هي كل الأشياء القياسية جدًا. هذه حالة "الوقوف على أكتاف العمالقة".


إذا كنت تريد حقًا التأكد من أن سلسلة تحتوي فقط على رقم ، أي رقم (عدد صحيح أو نقطة عائمة) ، ورقم بالضبط ، لا يمكنك استخدام parseInt() / parseFloat() أو Number() أو !isNaN() بواسطة أنفسهم. !isNaN() هي في الواقع ترجع true عندما يقوم Number() بإرجاع رقم ، و false عندما يعود NaN ، لذلك سوف أستبعده من بقية المناقشة.

المشكلة مع parseFloat() هي أنها ستقوم بإرجاع رقم إذا كانت السلسلة تحتوي على أي رقم ، حتى إذا كانت السلسلة لا تحتوي على رقم واحد بالضبط :

parseFloat("2016-12-31")  // returns 2016
parseFloat("1-1") // return 1
parseFloat("1.2.3") // returns 1.2

المشكلة مع Number() أنه سيتم إرجاع رقم في الحالات حيث القيمة التي تم تمريرها ليس رقماً على الإطلاق!

Number("") // returns 0
Number(" ") // returns 0
Number(" \u00A0   \t\n\r") // returns 0

تكمن المشكلة في تدوير الترجمات المنطقية الخاصة بك في أنه ما لم تقم بإنشاء التعبير المعتاد المطابق لمطابقة رقم نقطة عائمة كما تتعرف عليها جافا سكريبت ، فستتغيب عن الحالات أو تتعرف على الحالات التي لا ينبغي لك فيها. وحتى إذا كان بإمكانك تدوين تعبيرك المعتاد ، فلماذا؟ هناك طرق مضمنة أبسط للقيام بذلك.

ومع ذلك ، فإنه تبين أن Number()isNaN() ) يقوم بالشيء الصحيح لكل حالة حيث parseFloat() بإرجاع رقم عندما لا يجب ، والعكس بالعكس. لذلك ، لمعرفة ما إذا كانت السلسلة عبارة عن رقم صحيح تمامًا أم لا ، قم باستدعاء كلاً من الدالات ومعرفة ما إذا كان كلاهما صحيحًا أم لا:

function isNumber(str) {
  if (typeof str != "string") return false // we only process strings!
  // could also coerce to string: str = ""+str
  return !isNaN(str) && !isNaN(parseFloat(str))
}

في طلبي نحن نسمح فقط az az و 0-9 characters. لقد وجدت الإجابة أعلاه باستخدام " string ٪ 1 === 0" عملت ما لم تبدأ السلسلة بـ 0xnn (مثل 0x10) ثم ستعيدها كعدد رقمي عندما لا نريدها. يبدو أن الفخ البسيط التالي في الفحص الرقمي الخاص بي يؤدي الحيلة في حالاتنا المحددة.

function isStringNumeric(str_input){   
    //concat a temporary 1 during the modulus to keep a beginning hex switch combination from messing us up   
    //very simple and as long as special characters (non a-z A-Z 0-9) are trapped it is fine   
    return '1'.concat(str_input) % 1 === 0;}

تحذير : قد يستغل هذا خطأً قديمًا في Javascript و Actionscript [Number ("1" + the_string)٪ 1 === 0)] ، لا يمكنني التحدث عن ذلك ، ولكن هذا هو بالضبط ما نحتاجه.


لمعرفة ما إذا كان المتغير (بما في ذلك سلسلة) هو رقم ، تحقق مما إذا لم يكن رقمًا:

هذا يعمل بغض النظر عن ما إذا كان المتغير يحتوي على سلسلة أو رقم.

isNaN(num)         // returns true if the variable does NOT contain a valid number

أمثلة

isNaN(123)         // false
isNaN('123')       // false
isNaN('1e10000')   // false (This translates to Infinity, which is a number)
isNaN('foo')       // true
isNaN('10px')      // true

بالطبع ، يمكنك إبطال هذا إذا كنت بحاجة إلى ذلك. على سبيل المثال ، لتنفيذ المثال IsNumeric الذي قدمته:

function isNumeric(num){
  return !isNaN(num)
}

لتحويل سلسلة تحتوي على رقم إلى رقم:

يعمل فقط إذا كانت السلسلة تحتوي فقط على أحرف رقمية ، وإلا تقوم بإرجاع NaN .

+num               // returns the numeric value of the string, or NaN 
                   // if the string isn't purely numeric characters

أمثلة

+'12'              // 12
+'12.'             // 12
+'12..'            // Nan
+'.12'             // 0.12
+'..12'            // Nan
+'foo'             // NaN
+'12px'            // NaN

لتحويل سلسلة إلى رقم بشكل فضفاض

مفيد لتحويل "12px" إلى 12 ، على سبيل المثال:

parseInt(num)      // extracts a numeric value from the 
                   // start of the string, or NaN.

أمثلة

parseInt('12')     // 12
parseInt('aaa')    // NaN
parseInt('12px')   // 12
parseInt('foo2')   // NaN      These last two may be different
parseInt('12a5')   // 12       from what you expected to see. 

العربات

ضع في اعتبارك أنه بخلاف +num ، سيقوم parseInt (كما يوحي الاسم) بتحويل عائم إلى عدد صحيح عن طريق قطع كل شيء يتبع العلامة العشرية (إذا كنت تريد استخدام parseInt() بسبب هذا السلوك ، فربما تكون أفضل إيقاف باستخدام طريقة أخرى بدلاً من ذلك ):

+'12.345'          // 12.345
parseInt(12.345)   // 12
parseInt('12.345') // 12

سلاسل فارغة

قد تكون السلاسل الفارغة غير بديهية. +num يحول السلاسل الفارغة إلى صفر ، و isNaN() يفترض نفسه:

+''                // 0
isNaN('')          // false

لكن parseInt() لا توافق:

parseInt('')       // NaN

أفعلها هكذا:

function isString(value)
{
    return value.length !== undefined;
}
function isNumber(value)
{
    return value.NaN !== undefined;
}

وبالطبع ، سيتم تعثر سلسلة () هنا إذا قمت بتمرير بعض الكائنات الأخرى التي تم تحديد "طولها".


ربما هناك شخص أو شخصين يتصادفان في هذا السؤال ويحتاجان إلى فحص أكثر صرامة من المعتاد (مثلما فعلت). في هذه الحالة ، قد يكون هذا مفيدًا:

if(str === String(Number(str))) {
  // it's a "perfectly formatted" number
}

حذار! سيؤدي ذلك إلى رفض السلاسل مثل .1 و 40.000 و 080 و 00.1 . من الصعب إرضاءه للغاية - يجب أن تتطابق السلسلة مع " أقصى شكل مثالي " من رقم هذا الاختبار لتمريره.

ويستخدم مُنشئ السلاسل والعدد لإدخال السلسلة إلى رقم ثم العودة مرة أخرى ، وبالتالي يتحقق مما إذا كان "شكل الحد الأدنى الأمثل" لمحرك جافا سكريبت (الذي تم تحويله إلى مُنشئ Number الأولي) يتطابق مع السلسلة الأصلية.


يمكنك استخدام نتيجة Number عند تمرير وسيطة إلى مُنشئه.

إذا كان لا يمكن تحويل الوسيطة (سلسلة) إلى رقم ، فإنها ترجع NaN ، بحيث يمكنك تحديد ما إذا كانت السلسلة المقدمة رقمًا صحيحًا أم لا.

ملاحظات: ملاحظة عند تمرير سلسلة فارغة أو '\t\t' و '\n\t' كما سيعود الرقم 0؛ سيؤدي التمرير true إلى إرجاع 1 والعودة false 0.

    Number('34.00') // 34
    Number('-34') // -34
    Number('123e5') // 12300000
    Number('123e-5') // 0.00123
    Number('999999999999') // 999999999999
    Number('9999999999999999') // 10000000000000000 (integer accuracy up to 15 digit)
    Number('0xFF') // 255
    Number('Infinity') // Infinity  

    Number('34px') // NaN
    Number('xyz') // NaN
    Number('true') // NaN
    Number('false') // NaN

    // cavets
    Number('    ') // 0
    Number('\t\t') // 0
    Number('\n\t') // 0

parseInt () ، ولكن يجب أن تدرك أن هذه الوظيفة مختلفة قليلاً بمعنى أنها على سبيل المثال تُرجع 100 لـ parseInt ("100px").


PFB الحل العامل:

 function(check){ 
    check = check + "";
    var isNumber =   check.trim().length>0? !isNaN(check):false;
    return isNumber;
    }

جرب وظيفة isNan :

تحدد الدالة isNaN () ما إذا كانت القيمة رقمًا غير قانوني (Not-a-Number).

هذه الدالة ترجع true إذا كانت القيمة تساوي NaN. وإلا فإنه يرجع كاذبة.

تختلف هذه الوظيفة عن Number Number Number (محدد Number.isNaN() .

تقوم الدالة globalNNN () بتحويل القيمة التي تم اختبارها إلى رقم ، ثم تقوم باختبارها.

لا يقوم Number.isNan () بتحويل القيم إلى رقم ، ولن يقوم بإرجاع true لأي قيمة ليست من النوع Number ...


يمكنك الاستفادة من أنواع ، كما هو الحال مع تدفق librar y ، للحصول على ثابت ، والتحقق من وقت الترجمة. بالطبع ليس مفيدا بشكل رهيب لإدخال المستخدم.

// @flow

function acceptsNumber(value: number) {
  // ...
}

acceptsNumber(42);       // Works!
acceptsNumber(3.14);     // Works!
acceptsNumber(NaN);      // Works!
acceptsNumber(Infinity); // Works!
acceptsNumber("foo");    // Error!

لقد اختبرت وحلا مايكل هو الأفضل. صوَّت لإجابته أعلاه (ابحث في هذه الصفحة عن "إذا كنت تريد حقًا التأكد من وجود سلسلة" للعثور عليها). في الجوهر ، إجابته هي:

function isNumeric(num){
  num = "" + num; //coerce num to be a string
  return !isNaN(num) && !isNaN(parseFloat(num));
}

يعمل لكل حالة اختبار ، والتي وثقتها هنا: https://jsfiddle.net/wggehvp9/5/

العديد من الحلول الأخرى تفشل في حالات الحواف هذه: '' و null و \ "و \" true \ "و []. نظريًا ، يمكنك استخدامها ، مع معالجة الأخطاء المناسبة ، على سبيل المثال:

return !isNaN(num);

أو

return (+num === +num);

مع معالجة خاصة لـ \ \ s / ، خالية ، "" ، صواب ، خطأ ، [] (وغيرها؟)


حسنًا ، أنا أستخدم هذه التي صنعتها ...

لقد كان العمل حتى الآن:

function checkNumber(value) {
    if ( value % 1 == 0 )
    return true;
    else
    return false;
}

إذا لاحظت أي مشكلة في ذلك ، أخبرني ، من فضلك.


إذا كان ما تريد أن تجده موجودًا بالفعل في سلسلة ، ولم يكن لديك أمر تعديل في متناول اليد ، يمكنك استخدام الانضمام / الانقسام:

    function replaceMulti(haystack, needle, replacement)
    {
        return haystack.split(needle).join(replacement);
    }

    someString = 'the cat looks like a cat';
    console.log(replaceMulti(someString, 'cat', 'dog'));





javascript validation numeric