سؤال

كيف يمكنني تحويل سلسلة إلى عدد صحيح في جافا سكريبت؟

هل كانت مفيدة؟

المحلول

أبسط طريقة هي استخدام الأصل Number وظيفة:

var x = Number("1000")

إذا لم ينجح ذلك من أجلك، فهناك بخلاف, Unary Plus., parfefloat مع الأرض, ، و الرياضيات طرق.

تبادل

var x = parseInt("1000", 10); // you want to use radix 10
    // so you get a decimal number even with a leading 0 and an old browser ([IE8, Firefox 20, Chrome 22 and older][1])

Unary Plus إذا كانت السلسلة الخاصة بك موجودة بالفعل في شكل عدد صحيح:

var x = +"1000";

إذا كانت السلسلة الخاصة بك أو قد تكون تعويما وتريد عددا صحيحا:

var x = Math.floor("1000.01"); //floor automatically converts string to number

أو، إذا كنت ستستخدم Math.floor عدة مرات:

var floor = Math.floor;
var x = floor("1000.01");

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

var floor = Math.floor;
var x = floor(parseFloat("1000.01"));

ومن المثير للاهتمام، سوف تفعل math.rond (مثل math.floor) سلسلة لتحويل الأرقام، لذلك إذا كنت ترغب في تقريب الرقم (أو إذا كان لديك عدد صحيح في السلسلة)، فهذه طريقة رائعة، وربما المفضلة:

var round = Math.round;
var x = round("1000"); //equivalent to round("1000",0)

نصائح أخرى

جرب وظيفة التخلف:

var number = parseInt("10");

لكن هناك مشكلة. إذا حاولت تحويل "010" باستخدام الدالة المتبابقة، فهو يكتشف كرقم Octal، وسيعود الرقم 8. لذلك، تحتاج إلى تحديد راديكس (من 2 إلى 36). في هذه الحالة قاعدة 10.

parseInt(string, radix)

مثال:

var result = parseInt("010", 10) == 10; // Returns true

var result = parseInt("010") == 10; // Returns false

لاحظ أن parseInt يتجاهل البيانات السيئة بعد تحليل أي شيء صالح.
هذا guid سوف تحليل 51:

var result = parseInt('51e3daf6-b521-446a-9f5b-a1bb4d8bac36', 10) == 51; // Returns true

هناك طريقتان رئيسيتان لتحويل سلسلة إلى رقم في جافا سكريبت. إحدى الطرق هي تحليلها والطريقة الأخرى هي تغيير نوعها إلى رقم. جميع الحيل في الإجابات الأخرى (مثل Unary Plus) تنطوي على إكراه ضمنيا نوع السلسلة إلى رقم. يمكنك أيضا أن تفعل الشيء نفسه بشكل صريح مع وظيفة الرقم.

تفسير

var parsed = parseInt("97", 10);

المخلوع و parfefloat هي الوظائف المستخدمة في تحليل السلاسل إلى الأرقام. سيتوقف التحليل بصمت إذا كان يضرب شخصية لا يتعرف عليها، والتي يمكن أن تكون مفيدة لتحليل سلاسل مثل "92px"، ولكنها خطرة إلى حد ما، لأنها لن تعطيك أي نوع من الخطأ على الإدخال السيئ، بدلا من ذلك سأعود نان ما لم تبدأ السلسلة برقم. يتم تجاهل مساحة بيضاء في بداية السلسلة. إليك مثالا عليه في القيام بشيء مختلف على ما تريد، ولا يعطي أي إشارة إلى أن أي شيء حدث خطأ:

var widgetsSold = parseInt("97,800", 10); // widgetsSold is now 97

من الممارسات الجيدة تحديد راديكس دائما كوسيطة ثانية. في المتصفحات الأقدم، إذا بدأت السلسلة ب 0، فسيتم تفسيرها على أنها Octal إذا لم يتم تحديد Radix مما استغرق الكثير من الناس بسبب مفاجأة. يتم تشغيل السلوك الستاسي عشري عن طريق بدء تشغيل السلسلة مع 0x إذا لم يتم تحديد أي راديكس، على سبيل المثال 0xff. وبعد تتغير المعيار بالفعل مع Ecmascript 5، لم تعد المتصفحات الحديثة التي لم تعد تؤدي إلى Octal عندما يكون هناك رائدة 0 إذا لم يتم تحديد Radix. يتفهم ParseInt radixes إلى قاعدة 36، وفي هذه الحالة يتم التعامل مع كل من الحروف الكبيرة والصغيرة على أنها معادلة.

تغيير نوع السلسلة إلى رقم

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

var cast = Number("97");

هذا له سلوك مختلف طرق التحليل (على الرغم من أنه لا يزال يتجاهل Whitespace). الأمر أكثر صرامة: إذا لم يفهم كل السلسلة بأكملها مما يعود NaN, ، لذلك لا يمكنك استخدامه للحصول على سلاسل مثل 97px. وبعد نظرا لأنك تريد رقم بدائي بدلا من كائن Wrapper Number، فتأكد من عدم وضعه new أمام وظيفة الأرقام.

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

var rounded = Math.floor(Number("97.654"));  // other options are Math.ceil, Math.round
var fixed = Number("97.654").toFixed(0); // rounded rather than truncated
var bitwised = Number("97.654")|0;  // do not use for large numbers

سيؤدي أي مشغل bitwise (هنا إلى bithise أو، ولكن يمكنك أيضا القيام بالنفي المزدوج كما هو الحال في إجابة سابقة أو bitshift) سيؤدي إلى تحويل القيمة إلى عدد صحيح 32 بت، وسوف يتحول معظمها إلى عدد صحيح موقعة. لاحظ أن هذا لن ترغب في أن تريد أن ترغب في الأعداد الصحيحة الكبيرة. وبعد إذا تعذر تمثيل عدد صحيح في 32 جزءا، فسوف يتلف.

~~"3000000000.654" === -1294967296
// This is the same as
Number("3000000000.654")|0
"3000000000.654" >>> 0 === 3000000000 // unsigned right shift gives you an extra bit
"300000000000.654" >>> 0 === 3647256576 // but still fails with larger numbers

للعمل بشكل صحيح بأعداد أكبر، يجب عليك استخدام طرق التقريب

Math.floor("3000000000.654") === 3000000000
// This is the same as
Math.floor(Number("3000000000.654"))

ضع في اعتبارك أن كل هذه الطرق تفهم التدوين الأسي، لذلك 2e2 يكون 200 بدلا من نان. أيضا، عدد يفهم "اللانهاية"، في حين أن طرق التحليل لا.

العادة

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

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

مختارة () و + تختلف

parseInt("10.3456") // returns 10

+"10.3456" // returns 10.3456

على الرغم من سؤال قديم، ولكن ربما هذا يمكن أن يكون مفيدا لشخص ما.

يمكنني استخدام هذه الطريقة لتحويل السلسلة إلى إتجاه رقم

var str = "25";       // string
var number = str*1;   // number

لذلك، عند الضرب بنسبة 1، لا تتغير القيمة، ولكن JS بإرجاع رقم تلقائيا.

ولكن كما هو موضح أدناه، يجب استخدام هذا إذا كنت متأكدا من أن str هو رقم (أو يمكن تمثيله كرقم)، وإلا فإنه سيعود نان - وليس عددا.

يمكنك إنشاء وظيفة بسيطة لاستخدامها، على سبيل المثال

function toNumber(str) {
   return str*1;
}

enter image description here

جرب المخلوع.

var number = parseInt("10", 10); //number will have value of 10.

أسرع

var x = "1000"*1;

اختبار

هنا القليل من المقارنة بين السرعة (نظام التشغيل Mac OS فقط) ... :)

بالنسبة للكروم "Plus" و "Mul" أسرع (> 700،000،00 OP / SEC)، "Math.floor" هو أبطأ. بالنسبة ل Firefox "Plus" هو أبطأ (!) 'Mul' هو أسرع (> 900،000،000 مرجع / ثانية). في Safari 'Parseint' هو الأساطيع، "الرقم" أبطأ (ولكن إعادة استخدام متشابهة تماما،> 13،000،000 <31،000،000). إذن Safari للحصول على سلسلة Cast To Int هو أكثر من 10x أبطأ من المتصفحات الأخرى. لذلك الفائز هو "مول' :)

يمكنك تشغيله على متصفحك بواسطة هذا الرابطhttps://jsperf.com/js-cast-str-to-number/1.

enter image description here

تحديث

أنا أيضا اختبار var x = ~~"1000"; - على Chrome و Safari أبطأ قليلا من var x = "1000"*1 (<1٪)، على فايرفوكس أسرع قليلا (<1٪). قمت بتحديث الصورة أعلاه واختبار

لقد نشرت الإجابة الخاطئة هنا، آسف. مثبت.

هذا سؤال قديم، لكنني أحب هذه الخدعة:

~~"2.123"; //2
~~"5"; //5

يسقط سلبي Double Bitwise أي شيء بعد النقطة العشرية وتحويله إلى تنسيق رقم. لقد قيل لي أنها أسرع قليلا من وظائف الدعوة وغير مقتنعة، لكنني لست مقتنعا تماما.

تحرير: طريقة أخرى رأيت للتو هنا (سؤال حول JavaScript >>> المشغل، الذي هو التحول الصحيح لملء الصفر) الذي يوضح أن تحول رقم من 0 مع هذا المشغل يحول الرقم إلى UINT32. وهو لطيف إذا كنت تريد ذلك أيضا غير موقعة. وبعد مرة أخرى، هذا يتحول إلى عدد صحيح غير موقعة, ، والتي يمكن أن تؤدي إلى سلوكيات غريبة إذا كنت تستخدم رقم موقعة.

"-2.123" >>> 0; // 4294967294
"2.123" >>> 0; // 2
"-5" >>> 0; // 4294967291
"5" >>> 0; // 5

حذار إذا كنت تستخدم المعالجة لتحويل تعويم في الترميز العلمي! علي سبيل المثال:

parseInt("5.6e-14") 

سوف يؤدي إلى

5 

بدلا من

0

أيضا كملاحظة جانبية: يحتوي Mootools على Toint Fund () المستخدمة في أي سلسلة أصلية (أو تعويم (أو عدد صحيح)).

"2".toInt()   // 2
"2px".toInt() // 2
2.toInt()     // 2

لتحويل سلسلة إلى عدد صحيح، أوصي باستخدام ParSefloat و ليس مخلل. إليك لماذا:

باستخدام ParSefloat:

parseFloat('2.34cms')  //Output: 2.34
parseFloat('12.5')     //Output: 12.5
parseFloat('012.3')    //Output: 12.3

باستخدام ParseInt:

parseInt('2.34cms')  //Output: 2
parseInt('12.5')     //Output: 12
parseInt('012.3')    //Output: 12

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

يرجى الاطلاع على المثال أدناه. سوف يساعد في مسح شكوك

Example                  Result

parseInt("4")            4
parseInt("5aaa")         5
parseInt("4.33333")      4
parseInt("aaa");         NaN (means "Not a Number")

باستخدام الوظيفة المخلفة، فسيحدد المرجع الصحيح فقط من الحاضر وليس السلسلة

يمكننا ان نستخدم +(stringOfNumber) بدلا من استخدام parseInt(stringOfNumber)

السابق: +("21") إرجاع int من 21 مثل parseInt("21").

يمكننا استخدام المشغل Unary "+" Unary لتحليل تعويم أيضا ...

يحاول str - 0 لتحويل string ل number.

> str = '0'
> str - 0
  0
> str = '123'
> str - 0
  123
> str = '-12'
> str - 0
  -12
> str = 'asdf'
> str - 0
  NaN
> str = '12.34'
> str - 0
  12.34

فيما يلي روابطان لمقارنة أداء عدة طرق لتحويل السلسلة إلى Int

https://jsperf.com/number-vs-parseint-vs-plus.

http://phrogz.net/js/string_to_number.html.html.

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

var num = Number("999.5"); //999.5
var num = parseInt("999.5", 10); //999
var num = parseFloat("999.5"); //999.5
var num = +"999.5"; //999.5

أيضا أي الرياضيات العملية تحولها إلى الرقم، على سبيل المثال ...

var num = "999.5" / 1; //999.5
var num = "999.5" * 1; //999.5
var num = "999.5" - 1 + 1; //999.5
var num = "999.5" - 0; //999.5
var num = Math.floor("999.5"); //999
var num = ~~"999.5"; //999

طريقة تفضيلتي تستخدم + علامة، وهي الطريقة الأنيقة لتحويل سلسلة إلى الرقم في JavaScript.

في رأيي، لا توجد إجابة تغطي جميع حالات الحافة لأن تحليل تعويم يجب أن يؤدي إلى خطأ.

function parseInteger(value) {
    if(value === '') return NaN;
    const number = Number(value);
    return Number.isInteger(number) ? number : NaN;
}
parseInteger("4")            // 4
parseInteger("5aaa")         // NaN
parseInteger("4.33333")      // NaN
parseInteger("aaa");         // NaN

أعطتني Google هذه الإجابة نتيجة لذلك ...

كنت بحاجة فعلا إلى "حفظ" سلسلة كعيمة رأسية، لربط بين C و JavaScript، لذلك قمت بتحويل السلسلة إلى قيمة عدد صحيح:

/*
    Examples:
        int2str( str2int("test") ) == "test" // true
        int2str( str2int("t€st") ) // "t¬st", because "€".charCodeAt(0) is 8364, will be AND'ed with 0xff
    Limitations:
        max 4 chars, so it fits into an integer
*/
function str2int(the_str) {
    var ret = 0;
    var len = the_str.length;
    if (len >= 1) ret += (the_str.charCodeAt(0) & 0xff) <<  0;
    if (len >= 2) ret += (the_str.charCodeAt(1) & 0xff) <<  8;
    if (len >= 3) ret += (the_str.charCodeAt(2) & 0xff) << 16;
    if (len >= 4) ret += (the_str.charCodeAt(3) & 0xff) << 24;
    return ret;
}
function int2str(the_int) {
    var tmp = [
        (the_int & 0x000000ff) >>  0,
        (the_int & 0x0000ff00) >>  8,
        (the_int & 0x00ff0000) >> 16,
        (the_int & 0xff000000) >> 24
    ];
    var ret = "";
    for (var i=0; i<4; i++) {
        if (tmp[i] == 0)
            break;
        ret += String.fromCharCode(tmp[i]);
    }
    return ret;
}

كل ما سبق صحيح. يرجى التأكد من ذلك من قبل أن هذا رقم في سلسلة من خلال القيام "Lefeot X ===" رقم "" آخر حكيم سيعود نان

 var num = "fsdfsdf242342";
 typeof num => 'string';

 var num1 = "12423";
 typeof num1 => 'number';
 +num1 = > 12423`

خيار آخر هو مضاعفة XOR القيمة مع نفسها:

var i = 12.34;
console.log('i = ' + i);
console.log('i ⊕ i ⊕ i = ' + (i ^ i ^ i));

هذا سوف يخرج:

i = 12.34
i ⊕ i ⊕ i = 12

function doSth(){
  var a = document.getElementById('input').value;
  document.getElementById('number').innerHTML = toNumber(a) + 1;
}
function toNumber(str){
  return +str;
}
<input id="input" type="text">
<input onclick="doSth()" type="submit">
<span id="number"></span>

انا استعمل هذا

String.prototype.toInt = function (returnval) { 
    var i = parseInt(this);
    return isNaN(i) ? returnval !== undefined ? returnval : - 1  :      i; 
}

بهذه الطريقة أحصل دائما على الظهر.

أضفت فقط واحدة زائد (+) قبل السلسلة وهذا كان حل!

+"052254" //52254

آمل أن يساعد؛)

تلخيص الضرب من الأرقام مع قوة كل منهما من عشرة:

IE: 123 = 100 + 20 + 3 = 1 * 100 + 2 + 10 + 3 + 3 = 1 * (10 ^ 2) + 2 * (10 ^ 1) + 3 * (10 ^ 0)

function atoi(array) {

// use exp as (length - i), other option would be to reverse the array.
// multiply a[i] * 10^(exp) and sum

let sum = 0;

for (let i = 0; i < array.length; i++) {
    let exp = array.length-(i+1);
    let value = array[i] * Math.pow(10,exp);
    sum+=value;
}

return sum;

}

هنا هو أسهل الحل

let myNumber = "123" | 0;

الطريقة الأكثر أمانا للتأكد من حصولك على عدد صحيح صالح:

let integer = (parseInt(value, 10) || 0);

أمثلة:

// Example 1 - Invalid value:
let value = null;
let integer = (parseInt(value, 10) || 0);
// => integer = 0
// Example 2 - Valid value:
let value = "1230.42";
let integer = (parseInt(value, 10) || 0);
// => integer = 1230
// Example 3 - Invalid value:
let value = () => { return 412 };
let integer = (parseInt(value, 10) || 0);
// => integer = 0
function parseIntSmarter(str) {
    // ParseInt is bad because it returns 22 for "22thisendsintext"
    // Number() is returns NaN if it ends in non-numbers, but it returns 0 for empty or whitespace strings.
    return isNaN(Number(str)) ? NaN : parseInt(str, 10);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top