Преобразовать строку в целое число в JavaScript? - PullRequest
1525 голосов
/ 16 июля 2009

Как мне преобразовать строку в целое число в JavaScript?

Ответы [ 24 ]

1959 голосов
/ 16 июля 2009

Самый простой способ - использовать встроенную функцию Number:

var x = Number("1000")

Если это не работает для вас, то есть parseInt , унарный плюс , parseFloat с полом и Math.round методы.

ParseInt:

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])

Унарный плюс если ваша строка уже в виде целого числа:

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");

Если вы тот тип, который забывает вводить основание при вызове parseInt, вы можете использовать parseFloat и округлять его по своему усмотрению. Здесь я использую слово.

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

Интересно, что Math.round (например, Math.floor) будет выполнять преобразование строки в число, поэтому, если вы хотите, чтобы число округлялось (или если в строке было целое число), это отличный способ, может быть, мой любимый :

var round = Math.round;
var x = round("1000"); //equivalent to round("1000",0)
206 голосов
/ 16 июля 2009

Попробуйте функцию parseInt:

var number = parseInt("10");

Но есть проблема. Если вы попытаетесь преобразовать «010» с помощью функции parseInt, она обнаружит восьмеричное число и вернет число 8. Итак, вам нужно указать основание (от 2 до 36). В этом случае база 10.

parseInt(string, radix)

Пример:

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

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

Обратите внимание, что parseInt игнорирует неверные данные после анализа чего-либо действительного.
Этот гид будет проанализирован как 51:

var result = parseInt('51e3daf6-b521-446a-9f5b-a1bb4d8bac36', 10) == 51; // Returns true
119 голосов
/ 11 декабря 2013

Есть два основных способа преобразовать строку в число в javascript. Одним из способов является его разбор, а другим способом - изменить его тип на Number. Все приемы в других ответах (например, унарный плюс) включают в себя неявное приведение типа строки к числу. Вы также можете сделать то же самое явно с помощью функции Number.

Синтаксический

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

parseInt и parseFloat - две функции, используемые для разбора строк на числа. Синтаксический анализ прекратится тихо, если он попадет в символ, который он не распознает, что может быть полезно для анализа строк, таких как «92px», но это также несколько опасно, поскольку при неправильном вводе вы не получите никакой ошибки, вместо этого вы вернусь NaN, если строка не начинается с числа. Пробелы в начале строки игнорируются. Вот пример того, как он делает что-то отличное от того, что вы хотите, и не указывает, что что-то пошло не так:

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

Хорошей практикой является всегда указывать основание в качестве второго аргумента. В старых браузерах, если строка начиналась с 0, она интерпретировалась бы как восьмеричная, если бы не было указано основание, что застало многих врасплох. Поведение для шестнадцатеричного запускается, если строка начинается с 0x, если не указано основание, например 0xff. Стандарт на самом деле изменился с ecmascript 5, поэтому современные браузеры больше не запускают восьмеричный код, когда идет начальный 0, если не задано основание. parseInt понимает радиусы до основания 36, и в этом случае как прописные, так и строчные буквы рассматриваются как эквивалентные.

Изменение типа строки на число

Все другие трюки, упомянутые выше, которые не используют parseInt, включают в себя неявное приведение строки в число. Я предпочитаю делать это явно,

var cast = Number("97");

Это поведение отличается от методов синтаксического анализа (хотя оно по-прежнему игнорирует пробелы). Это более строгое: если он не понимает всю строку, чем возвращает NaN, то вы не можете использовать его для таких строк, как 97px. Поскольку вам нужен простой номер, а не объект-обертка Number, убедитесь, что вы не ставите new перед функцией Number.

Очевидно, что преобразование в Number дает вам значение, которое может быть числом с плавающей точкой, а не целым числом, поэтому, если вам нужно целое число, вам нужно его изменить. Есть несколько способов сделать это:

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

Любой побитовый оператор (здесь я сделал побитовый или, но вы также можете сделать двойное отрицание, как в предыдущем ответе или сдвиге битов), преобразует значение в 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, а не NaN. Кроме того, Number понимает «Бесконечность», а методы синтаксического анализа - нет.

Custom

Маловероятно, что любой из этих методов сделает именно то, что вы хотите. Например, обычно я хотел бы выдать ошибку, если синтаксический анализ завершился неудачно, и мне не нужна поддержка бесконечности, экспонент или начальных пробелов. В зависимости от вашего варианта использования иногда имеет смысл написать пользовательскую функцию преобразования.

Всегда проверяйте, что выходные данные Number или одного из методов разбора соответствуют ожидаемому числу. Вы почти наверняка захотите использовать isNaN, чтобы убедиться, что число не является NaN (обычно это единственный способ узнать, что анализ не выполнен).

50 голосов
/ 14 марта 2012

ParseInt () и + разные

parseInt("10.3456") // returns 10

+"10.3456" // returns 10.3456
36 голосов
/ 16 марта 2014

Хоть и старый вопрос, но, может быть, это кому-нибудь пригодится.

Я использую этот способ преобразования строки в int число

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

Таким образом, при умножении на 1 значение не изменяется, но js автоматически возвращает число.

Но, как показано ниже, это следует использовать, если вы уверены, что str является числом (или может быть представлено как число), в противном случае он вернет NaN - не число.

Вы можете создать простую функцию для использования, например,

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

enter image description here

32 голосов
/ 16 июля 2009

Попробуйте parseInt.

var number = parseInt("10", 10); //number will have value of 10.
29 голосов
/ 28 марта 2017

быстрый

var x = "1000"*1;

Test

Вот небольшое сравнение скорости (только Mac OS) ...:)

Для chrome «плюс» и «мул» самые быстрые (> 700 000,00 операций в секунду), «Math.floor» - самый медленный. Для Firefox «плюс» - самый медленный (!), «Мул» - самый быстрый (> 900 000 000 операций в секунду). В Safari «parseInt» - это посты, «номер» - самый медленный (но результаты очень похожи,> 13 000 000 <31 000 000). Так что Safari для приведения строки к int более чем в 10 раз медленнее, чем другие браузеры. Таким образом, победителем становится '<strong> mul ':)

Вы можете запустить его в своем браузере по этой ссылке https://jsperf.com/js-cast-str-to-number/1

enter image description here

Обновление

Я также тестирую var x = ~~"1000"; - в Chrome и Safari немного медленнее, чем var x = "1000"*1 (<1%), в Firefox немного быстрее (<1%). Я обновляю картинку выше и проверяю </p>

26 голосов
/ 16 января 2013

Я разместил неправильный ответ здесь, извините. неподвижная.

Это старый вопрос, но мне нравится этот трюк:

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

Двойной побитовый минус отбрасывает что-либо после десятичной точки И преобразует его в числовой формат. Мне сказали, что это немного быстрее, чем вызов функций и еще много чего, но я не совсем убежден.

РЕДАКТИРОВАТЬ: Другой метод, который я только что видел здесь (вопрос об операторе javascript >>>, который является сдвигом вправо с нулевым заполнением), который показывает, что смещение числа на 0 с помощью этого оператора преобразует номер uint32 , что хорошо, если вы также хотите его без знака . Опять же, это преобразуется в целое число без знака , которое может привести к странному поведению, если вы используете число со знаком.

"-2.123" >>> 0; // 4294967294
"2.123" >>> 0; // 2
"-5" >>> 0; // 4294967291
"5" >>> 0; // 5
18 голосов
/ 01 июля 2010

Осторожно, если вы используете parseInt для преобразования числа с плавающей точкой в ​​научную запись! Например:

parseInt("5.6e-14") 

приведет к

5 

вместо

0
15 голосов
/ 17 июля 2009

Также как примечание: Mootools имеет функцию toInt (), которая используется для любой собственной строки (или с плавающей точкой (или целое число)).

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