number - form validation javascript




التحقق من الأرقام العشرية في JavaScript-IsNumeric() (20)

ما هي الطريقة الأنظف والأكثر فعالية للتحقق من صحة الأرقام العشرية في جافا سكريبت؟

نقاط المكافأة لـ:

  1. وضوح. يجب أن يكون الحل نظيفًا وبسيطًا.
  2. عبر منصة.

حالات تجريبية:

01. IsNumeric('-1')      => true
02. IsNumeric('-1.5')    => true
03. IsNumeric('0')       => true
04. IsNumeric('0.42')    => true
05. IsNumeric('.42')     => true
06. IsNumeric('99,999')  => false
07. IsNumeric('0x89f')   => false
08. IsNumeric('#abcdef') => false
09. IsNumeric('1.2.3')   => false
10. IsNumeric('')        => false
11. IsNumeric('blah')    => false

Arrrgh! لا تستمع إلى إجابات التعبير العادي. ريجسي رديء لهذا ، وأنا لا أتحدث فقط عن الأداء. من السهل جدًا أن تجعل من الخطأ ، من المستحيل تحديد الأخطاء باستخدام تعبيرك المعتاد.

إذا لم تتمكن من استخدام isNaN() ، فيجب أن يعمل ذلك بشكل أفضل:

function IsNumeric(input)
{
    return (input - 0) == input && (''+input).trim().length > 0;
}

وإليك كيف يعمل:

يقوم تعبير (input - 0) بإجبار JavaScript على عمل الإجبار على قيمة الإدخال الخاصة بك؛ يجب أن يتم تفسيرها أولاً كرقم لعملية الطرح. إذا فشل هذا التحويل إلى رقم ، سيؤدي التعبير إلى NaN . ثم تتم مقارنة هذه النتيجة الرقمية بالقيمة الأصلية التي تم تمريرها بها. بما أن الجانب الأيسر أصبح الآن رقميًا ، يتم استخدام الإجبار مرة أخرى. والآن بعد أن تم إجبار المدخلات من كلا الجانبين على نفس النوع من نفس القيمة الأصلية ، فستعتقد أنه يجب أن تكون هي نفسها دائمًا (صحيح دائمًا). ومع ذلك ، هناك قاعدة خاصة تقول أن NaN لا تساوي أبدًا NaN ، وبالتالي فإن القيمة التي لا يمكن تحويلها إلى رقم (والقيم التي لا يمكن تحويلها إلى أرقام) ستؤدي إلى خطأ.

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

باختصار ، إذا كنت تريد معرفة ما إذا كان يمكن تحويل قيمة إلى رقم ، فعليًا حاول تحويله إلى رقم.

عدت وقمت ببعض الأبحاث عن سبب عدم وجود سلسلة من الفراغات البيضاء للناتج المتوقع ، وأعتقد أنني حصلت عليها الآن: يتم فرض سلسلة فارغة على 0 بدلاً من NaN . ببساطة ، قطع السلسلة قبل فحص الطول ستتعامل مع هذه الحالة.

تشغيل اختبارات الوحدة مقابل الشفرة الجديدة وفشلها فقط في اللانهاية والحروف المنطقية ، والوقت الوحيد الذي يجب أن يكون مشكلة هو إذا كنت تولد رمزًا (في الحقيقة ، من سيكتب حرفياً ويتحقق من كونه رقميًا؟ يجب أن تعرف ) ، وهذا من شأنه أن يكون بعض رمز غريب لتوليد.

ولكن ، مرة أخرى ، فإن السبب الوحيد لاستخدام هذا هو إذا كان عليك تجنب سبب عدم وجود ().


أدرك أن السؤال الأصلي لم يشر إلى jQuery ، ولكن إذا كنت تستخدم jQuery ، فيمكنك القيام بما يلي:

$.isNumeric(val)

بسيط.

https://api.jquery.com/jQuery.isNumeric/ (اعتبارًا من jQuery 1.7)


استخدم الوظيفة isNaN . أعتقد أنه إذا قمت بإجراء اختبار !isNaN(yourstringhere) فإنه يعمل بشكل جيد في أي من هذه الحالات.


المشكلة الوحيدة التي واجهتها مع answer @ CMS هي استبعاد NaN و Infinity ، وهي أرقام مفيدة للعديد من المواقف. إحدى الطرق للتحقق من NaN هي التحقق من القيم الرقمية التي لا تساوي نفسها ، NaN != NaN ! إذاً هناك 3 اختبارات تود التعامل معها ...

function isNumber(n) {
  n = parseFloat(n);
  return !isNaN(n) || n != n;
}
function isFiniteNumber(n) {
  n = parseFloat(n);
  return !isNaN(n) && isFinite(n);
}    
function isComparableNumber(n) {
  n = parseFloat(n);
  return (n >=0 || n < 0);
}

isFiniteNumber('NaN')
false
isFiniteNumber('OxFF')
true
isNumber('NaN')
true
isNumber(1/0-1/0)
true
isComparableNumber('NaN')
false
isComparableNumber('Infinity')
true

إجابتي iscomparableNumber قريبة جداً من answer أنيقة أخرى ، ولكنها تتعامل مع سداسي عشرية وتمثيلات أخرى للأرقام.


بلدي الحل،

function isNumeric(input) {
    var number = /^\-{0,1}(?:[0-9]+){0,1}(?:\.[0-9]+){0,1}$/i;
    var regex = RegExp(number);
    return regex.test(input) && input.length>0;
}

يبدو أنه يعمل في كل موقف ، لكنني قد أكون مخطئًا.


زوج من الاختبارات لإضافة:

IsNumeric('01.05') => false
IsNumeric('1.') => false
IsNumeric('.') => false

خطرت لي هذه:

function IsNumeric(input) {
    return /^-?(0|[1-9]\d*|(?=\.))(\.\d+)?$/.test(input);
}

يغطي الحل:

  • علامة سلبية اختيارية في البداية
  • صفر واحد ، أو واحد أو أكثر من الأرقام التي لا تبدأ بالرقم 0 ، أو لا شيء طالما أن هناك فترة
  • فترة يتبعها رقم واحد أو أكثر

منذ jQuery 1.7 ، يمكنك استخدام api.jquery.com/jQuery.isNumeric :

$.isNumeric('-1');      // true
$.isNumeric('-1.5');    // true
$.isNumeric('0');       // true
$.isNumeric('0.42');    // true
$.isNumeric('.42');     // true
$.isNumeric('0x89f');   // true (valid hexa number)
$.isNumeric('99,999');  // false
$.isNumeric('#abcdef'); // false
$.isNumeric('1.2.3');   // false
$.isNumeric('');        // false
$.isNumeric('blah');    // false

فقط لاحظ أنه على عكس ما قلته ، 0x89f رقم صحيح (سداسي)


نعم ، سيكون isNaN(object) المدمج isNaN(object) أسرع بكثير من أي تعبير منطقي ، لأنه مدمج ومجمع ، بدلاً من تفسيره على الطاير.

على الرغم من اختلاف النتائج إلى حد ما عما تبحث عنه ( جربه ):

                                              // IS NUMERIC
document.write(!isNaN('-1') + "<br />");      // true
document.write(!isNaN('-1.5') + "<br />");    // true
document.write(!isNaN('0') + "<br />");       // true
document.write(!isNaN('0.42') + "<br />");    // true
document.write(!isNaN('.42') + "<br />");     // true
document.write(!isNaN('99,999') + "<br />");  // false
document.write(!isNaN('0x89f') + "<br />");   // true
document.write(!isNaN('#abcdef') + "<br />"); // false
document.write(!isNaN('1.2.3') + "<br />");   // false
document.write(!isNaN('') + "<br />");        // true
document.write(!isNaN('blah') + "<br />");    // false

يبدو أن هذه الطريقة تعمل بشكل جيد:

function IsNumeric(input){
    var RE = /^-{0,1}\d*\.{0,1}\d+$/;
    return (RE.test(input));
}

واختبارها:

// alert(TestIsNumeric());

function TestIsNumeric(){
    var results = ''
    results += (IsNumeric('-1')?"Pass":"Fail") + ": IsNumeric('-1') => true\n";
    results += (IsNumeric('-1.5')?"Pass":"Fail") + ": IsNumeric('-1.5') => true\n";
    results += (IsNumeric('0')?"Pass":"Fail") + ": IsNumeric('0') => true\n";
    results += (IsNumeric('0.42')?"Pass":"Fail") + ": IsNumeric('0.42') => true\n";
    results += (IsNumeric('.42')?"Pass":"Fail") + ": IsNumeric('.42') => true\n";
    results += (!IsNumeric('99,999')?"Pass":"Fail") + ": IsNumeric('99,999') => false\n";
    results += (!IsNumeric('0x89f')?"Pass":"Fail") + ": IsNumeric('0x89f') => false\n";
    results += (!IsNumeric('#abcdef')?"Pass":"Fail") + ": IsNumeric('#abcdef') => false\n";
    results += (!IsNumeric('1.2.3')?"Pass":"Fail") + ": IsNumeric('1.2.3') => false\n";
    results += (!IsNumeric('')?"Pass":"Fail") + ": IsNumeric('') => false\n";
    results += (!IsNumeric('blah')?"Pass":"Fail") + ": IsNumeric('blah') => false\n";

    return results;
}

اقترضت هذا التعبير المعتاد من http://www.codetoad.com/javascript/isnumeric.asp . تفسير:

/^ match beginning of string
-{0,1} optional negative sign
\d* optional digits
\.{0,1} optional decimal point
\d+ at least one digit
$/ match end of string

يمكن التحقق من قيمة عدد صحيح بواسطة:

function isNumeric(value) {
    var bool = isNaN(+value));
    bool = bool || (value.indexOf('.') != -1);
    bool = bool || (value.indexOf(",") != -1);
    return !bool;
};

هذه الطريقة أسهل وأسرع! يتم فحص جميع الاختبارات!


CMS 'إجابة : قصاصة الخاص بك فشل في حالات بيضاء على الجهاز الخاص بي باستخدام nodejs. لذا قمت بدمجها مع إجابة جويل على ما يلي:

is_float = function(v) {
    return !isNaN(v) && isFinite(v) &&
        (typeof(v) == 'number' || v.replace(/^\s+|\s+$/g, '').length > 0);
}

أنا غير متفق عليه مع تلك الحالات العائمة:

var t = [
        0,
        1.2123,
        '0',
        '2123.4',
        -1,
        '-1',
        -123.423,
        '-123.432',
        07,
        0xad,
        '07',
        '0xad'
    ];

وتلك الحالات التي لا توجد عوامات (بما في ذلك المسافات البيضاء الفارغة والأشياء / المصفوفات):

    var t = [
        'hallo',
        [],
        {},
        'jklsd0',
        '',
        "\t",
        "\n",
        ' '
    ];

كل شيء يعمل كما هو متوقع هنا. ربما هذا يساعد.

يمكن العثور على رمز المصدر الكامل لهذا here .


الإجابة على @ Joel قريبة جدًا ، ولكنها ستفشل في الحالات التالية:

// Whitespace strings:
IsNumeric(' ')    == true;
IsNumeric('\t\t') == true;
IsNumeric('\n\r') == true;

// Number literals:
IsNumeric(-1)  == false;
IsNumeric(0)   == false;
IsNumeric(1.1) == false;
IsNumeric(8e5) == false;

منذ بعض الوقت ، اضطررت إلى تنفيذ دالة IsNumeric ، لمعرفة ما إذا كان المتغير يحتوي على قيمة رقمية ، بغض النظر عن نوعه ، يمكن أن يكون عبارة عن String تحتوي على قيمة عددية (كان علي أن أضع في اعتبارها أيضًا الترميز الأسي ، وما إلى ذلك) ، Number الكائن ، أي شيء يمكن أن يتم تمريره إلى هذه الوظيفة ، لا أستطيع إجراء أي نوع من الافتراضات ، مع الحرص على نوع الإجبار (على سبيل المثال. +true == 1; ولكن لا ينبغي اعتبار true "numeric" ).

أعتقد أنه من الجدير مشاركة هذه المجموعة من اختبارات الوحدة +30 التي تم إجراؤها على العديد من التطبيقات الوظيفية ، وكذلك مشاركة الاختبار الذي نجح في جميع اختباراتي:

function isNumeric(n) {
    return !isNaN(parseFloat(n)) && isFinite(n);
}

PS isNaN و isFinite لديها سلوك محير بسبب التحويل القسري إلى الرقم. في ES6 ، Number.isNaN & Number.isFinite بإصلاح هذه المشكلات. ضع ذلك في الاعتبار عند استخدامها.

تحديث : إليك كيفية عمل jQuery الآن (2.2-stable) :

isNumeric: function(obj) {
    var realStringObj = obj && obj.toString();
    return !jQuery.isArray(obj) && (realStringObj - parseFloat(realStringObj) + 1) >= 0;
}

تحديث : الزاوي 4.3 :

export function isNumeric(value: any): boolean {
    return !isNaN(value - parseFloat(value));
}

knockoutJs Inbuild وظائف التحقق من صحة المكتبة

من خلال توسيعه الحصول على التحقق من صحة الحقل

1) الرقم

self.number = ko.observable(numberValue) .extend ({number: true}) ؛

حالة اختبار

numberValue = '0.0'    --> true
numberValue = '0'      --> true
numberValue = '25'     --> true
numberValue = '-1'     --> true
numberValue = '-3.5'   --> true
numberValue = '11.112' --> true
numberValue = '0x89f'  --> false
numberValue = ''       --> false
numberValue = 'sfsd'   --> false
numberValue = 'dg##$'  --> false

2) رقم

self.number = ko.observable(numberValue) .extend ({digit: true}) ؛

حالة اختبار

numberValue = '0'      --> true
numberValue = '25'     --> true
numberValue = '0.0'    --> false
numberValue = '-1'     --> false
numberValue = '-3.5'   --> false
numberValue = '11.112' --> false
numberValue = '0x89f'  --> false
numberValue = ''       --> false
numberValue = 'sfsd'   --> false
numberValue = 'dg##$'  --> false

3) دقيقة و كحد أقصى

self.number = ko.observable(numberValue) .extend ({min: 5}). expand ({max: 10}) ؛

يقبل هذا المجال القيمة بين 5 و 10 فقط

حالة اختبار

numberValue = '5'    --> true
numberValue = '6'    --> true
numberValue = '6.5'  --> true
numberValue = '9'    --> true
numberValue = '11'   --> false
numberValue = '0'    --> false
numberValue = ''    --> false

أدرك أن هذا قد تم الإجابة عليه عدة مرات ، ولكن ما يلي هو مرشح لائق يمكن أن يكون مفيدا في بعض السيناريوهات.

تجدر الإشارة إلى أنه يفترض أن ".42" ليس رقمًا ، و "4." ليس رقمًا ، لذا يجب مراعاة ذلك.

function isDecimal(x) {
  return '' + x === '' + +x;
}

function isInteger(x) {
  return '' + x === '' + parseInt(x);
}

و isDecimalيمر الاختبار التالي:

function testIsNumber(f) {
  return f('-1') && f('-1.5') && f('0') && f('0.42')
    && !f('.42') && !f('99,999') && !f('0x89f')
    && !f('#abcdef') && !f('1.2.3') && !f('') && !f('blah');
}

تكمن الفكرة هنا في أن كل رقم أو رقم صحيح يحتوي على تمثيل سلسلة "متعارف عليه" واحد ، ويجب رفض كل تمثيل غير قانوني. لذا ، أرسلنا إلى الرقم والعودة ، ونرى ما إذا كانت النتيجة هي السلسلة الأصلية.

يعتمد ما إذا كانت هذه الوظائف مفيدة بالنسبة لك على حالة الاستخدام. ميزة واحدة هي أن السلاسل المميزة تمثل أرقامًا مميزة (إذا اجتاز كلاهما isNumber()الاختبار).

هذا هو على سبيل المثال ذات الصلة للأرقام كأسماء خصائص الكائن.

var obj = {};
obj['4'] = 'canonical 4';
obj['04'] = 'alias of 4';
obj[4];  // prints 'canonical 4' to the console.

أود إضافة ما يلي:

1. IsNumeric('0x89f') => true
2. IsNumeric('075') => true

تبدأ الأرقام السداسيّة الموجبة بالظهور مع 0xالأرقام السداسيّة السّداسيّة -0x. تبدأ أرقام oct موجبة مع 0الأرقام الثمانية الساذجة وتبدأ -0. هذا واحد يأخذ معظم ما سبق ذكره في الاعتبار ، ولكن يشمل عرافة وأرقام ثماني ، علمية سلبية ، إنفينيتي وإزالة العلمية العشرية ( 4e3.2غير صالحة).

function IsNumeric(input){
  var RE = /^-?(0|INF|(0[1-7][0-7]*)|(0x[0-9a-fA-F]+)|((0|[1-9][0-9]*|(?=[\.,]))([\.,][0-9]+)?([eE]-?\d+)?))$/;
  return (RE.test(input));
}

يبدو أن ما يلي يعمل بشكل جيد في العديد من الحالات:

function isNumeric(num) {
    return (num > 0 || num === 0 || num === '0' || num < 0) && num !== true && isFinite(num);
}

تم بناء هذا الجزء العلوي من هذه الإجابة (وهي لهذا الجواب أيضًا): https://.com/a/1561597/1985601


لم يتم إرجاع أي من الإجابات falseللأوتار الفارغة ، وهو حل لذلك ...

function is_numeric(n)
{
 return (n != '' && !isNaN(parseFloat(n)) && isFinite(n));
}

لمعرفة ما إذا كان المتغير يحتوي على رقم صحيح وليس مجرد سلسلة تشبه الرقم ، Number.isFinite(value)فيمكن استخدامه.

هذا جزء من اللغة منذ ES2015

أمثلة:

Number.isFinite(Infinity)   // false
Number.isFinite(NaN)        // false
Number.isFinite(-Infinity)  // false

Number.isFinite(0)          // true
Number.isFinite(2e64)       // true

Number.isFinite('0')        // false
Number.isFinite(null)       // false

function IsNumeric(num) {
     return (num >=0 || num < 0);
}

يعمل هذا من أجل أرقام نوع 0x23 أيضاً.


function inNumeric(n){
   return Number(n).toString() === n;
}

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





numbers