javascript - سكربت - شرح جافا سكريبت




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

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

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

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

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


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

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

أفعلها هكذا:

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

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


إذا كان أي شخص يحصل على هذا الحد ، فقد قضيت بعض الوقت في اختراق هذه المحاولات لتصحيح patch.js ( https://github.com/moment/moment ). هذا شيء أخذته منه:

function isNumeric(val) {
    var _val = +val;
    return (val !== val + 1) //infinity check
        && (_val === +val) //Cute coercion check
        && (typeof val !== 'object') //Array/object check
}

يعالج الحالات التالية:

صحيح! :

isNumeric("1"))
isNumeric(1e10))
isNumeric(1E10))
isNumeric(+"6e4"))
isNumeric("1.2222"))
isNumeric("-1.2222"))
isNumeric("-1.222200000000000000"))
isNumeric("1.222200000000000000"))
isNumeric(1))
isNumeric(0))
isNumeric(-0))
isNumeric(1010010293029))
isNumeric(1.100393830000))
isNumeric(Math.LN2))
isNumeric(Math.PI))
isNumeric(5e10))

خاطئة! :

isNumeric(NaN))
isNumeric(Infinity))
isNumeric(-Infinity))
isNumeric())
isNumeric(undefined))
isNumeric('[1,2,3]'))
isNumeric({a:1,b:2}))
isNumeric(null))
isNumeric([1]))
isNumeric(new Date()))

من سخرية القدر ، أن أتعامل مع أكثر:

isNumeric(new Number(1)) => false

أي اقتراحات نرحب. :]


إذا كنت تريد حقًا التأكد من أن سلسلة تحتوي فقط على رقم ، أي رقم (عدد صحيح أو نقطة عائمة) ، ورقم بالضبط ، لا يمكنك استخدام 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))
}

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

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

السؤال القديم ، ولكن هناك عدة نقاط مفقودة في الإجابات المحددة.

الترميز العلمي.

!isNaN('1e+30') true ، ولكن في معظم الحالات عندما يطلب الأشخاص أرقامًا ، لا يريدون مطابقة أشياء مثل 1 1e+30 .

قد تتصرف أعداد كبيرة عائمة غريبة

مراقبة (باستخدام Node.js):

> var s = Array(16 + 1).join('9')
undefined
> s.length
16
> s
'9999999999999999'
> !isNaN(s)
true
> Number(s)
10000000000000000
> String(Number(s)) === s
false
>

من ناحية أخرى:

> var s = Array(16 + 1).join('1')
undefined
> String(Number(s)) === s
true
> var s = Array(15 + 1).join('9')
undefined
> String(Number(s)) === s
true
>

لذا ، إذا كان أحد يتوقع String(Number(s)) === s ، عندئذٍ حدّد السلاسل إلى 15 رقمًا على الأكثر (بعد حذف الأصفار البادئة).

ما لا نهاية

> typeof Infinity
'number'
> !isNaN('Infinity')
true
> isFinite('Infinity')
false
>

بالنظر إلى كل ذلك ، تأكد من أن الرقم المعطى هو عدد يلبي كل ما يلي:

  • التدوين غير العلمي
  • تحويل يمكن التنبؤ به إلى Number والرجوع إلى String
  • محدود

ليست مهمة سهلة. هنا نسخة بسيطة:

  function isNonScientificNumberString(o) {
    if (!o || typeof o !== 'string') {
      // Should not be given anything but strings.
      return false;
    }
    return o.length <= 15 && o.indexOf('e+') < 0 && o.indexOf('E+') < 0 && !isNaN(o) && isFinite(o);
  }

ومع ذلك ، حتى هذه ليست بعيدة عن الاكتمال. لا يتم التعامل مع الأصفار الرائدة هنا ، لكنهم يقومون بربط اختبار الطول.


بلدي الحل:

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

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


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

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

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

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


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

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

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

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


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

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 / ، خالية ، "" ، صواب ، خطأ ، [] (وغيرها؟)


لماذا لا يكون تنفيذ 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));
};

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


ويمكنك أن تذهب بطريقة RegExp:

var num = "987238";

if(num.match(/^-{0,1}\d+$/)){
  //valid integer (positive or negative)
}else if(num.match(/^\d+\.\d+$/)){
  //valid float
}else{
  //not valid 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




numeric