Làm cách nào để chuyển đổi một chuỗi thành một số nguyên trong JavaScript?
Làm cách nào để chuyển đổi một chuỗi thành một số nguyên trong JavaScript?
Câu trả lời:
Cách đơn giản nhất là sử dụng Number
hàm riêng:
var x = Number("1000")
Nếu điều đó không phù hợp với bạn, thì có các phương thức parseInt , unary plus , parseFloat with floor và Math.round .
phân tích:
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 nếu chuỗi của bạn đã ở dạng số nguyên:
var x = +"1000";
nếu chuỗi của bạn là hoặc có thể là số float và bạn muốn một số nguyên:
var x = Math.floor("1000.01"); //floor automatically converts string to number
hoặc, nếu bạn sẽ sử dụng Math.floor nhiều lần:
var floor = Math.floor;
var x = floor("1000.01");
Nếu bạn là người quên đặt cơ số khi bạn gọi parseInt, bạn có thể sử dụng parseFloat và làm tròn nó theo cách bạn muốn. Ở đây tôi dùng sàn.
var floor = Math.floor;
var x = floor(parseFloat("1000.01"));
Thật thú vị, Math.round (như Math.floor) sẽ thực hiện chuyển đổi chuỗi thành số, vì vậy nếu bạn muốn số được làm tròn (hoặc nếu bạn có số nguyên trong chuỗi), đây là một cách tuyệt vời, có thể là yêu thích của tôi:
var round = Math.round;
var x = round("1000"); //equivalent to round("1000",0)
'4'>>0
và '4'>>>0
.
parseInt
và parseFloat
vui vẻ nhận thư. Chỉ Number
trả lại NaN
một cách nhất quán.
NaN
cho mọi giá trị không chính xác là một số nguyên. Do đó, không ai trong số này làm việc Number('2.2')
cưỡng chế 2
và Number('')
ép buộc về 0.
Hãy thử chức năng parseInt:
var number = parseInt("10");
Nhưng có một vấn đề. Nếu bạn cố gắng chuyển đổi "010" bằng hàm parseInt, nó sẽ phát hiện dưới dạng số bát phân và sẽ trả về số 8. Vì vậy, bạn cần chỉ định một cơ số (từ 2 đến 36). Trong trường hợp này cơ sở 10.
parseInt(string, radix)
Thí dụ:
var result = parseInt("010", 10) == 10; // Returns true
var result = parseInt("010") == 10; // Returns false
Lưu ý rằng parseInt
bỏ qua dữ liệu xấu sau khi phân tích cú pháp bất cứ điều gì hợp lệ.
Hướng dẫn này sẽ phân tích thành 51:
var result = parseInt('51e3daf6-b521-446a-9f5b-a1bb4d8bac36', 10) == 51; // Returns true
parseInt('0asdf', 10)
sản xuất 0
.
Có hai cách chính để chuyển đổi một chuỗi thành một số trong javascript. Một cách là phân tích cú pháp và cách khác là thay đổi kiểu của nó thành Số. Tất cả các thủ thuật trong các câu trả lời khác (ví dụ: unary plus) liên quan đến việc ép buộc kiểu chuỗi thành một số. Bạn cũng có thể làm điều tương tự một cách rõ ràng với hàm Number.
Phân tích cú pháp
var parsed = parseInt("97", 10);
parseInt và parseFloat là hai hàm được sử dụng để phân tích chuỗi thành số. Phân tích cú pháp sẽ dừng âm thầm nếu nó chạm vào một ký tự mà nó không nhận ra, điều này có thể hữu ích cho việc phân tích chuỗi như "92px", nhưng nó cũng hơi nguy hiểm, vì nó sẽ không gây ra bất kỳ lỗi nào cho đầu vào xấu, thay vào đó bạn sẽ lấy lại NaN trừ khi chuỗi bắt đầu bằng số. Khoảng trắng ở đầu chuỗi bị bỏ qua. Đây là một ví dụ về việc nó làm một cái gì đó khác với những gì bạn muốn và không đưa ra dấu hiệu nào cho thấy có gì sai:
var widgetsSold = parseInt("97,800", 10); // widgetsSold is now 97
Đó là một thực hành tốt để luôn chỉ định cơ số là đối số thứ hai. Trong các trình duyệt cũ hơn, nếu chuỗi bắt đầu bằng 0, nó sẽ được hiểu là bát phân nếu cơ số không được chỉ định khiến nhiều người ngạc nhiên. Hành vi cho hệ thập lục phân được kích hoạt bằng cách bắt đầu chuỗi bằng 0x nếu không có cơ số được chỉ định, ví dụ 0xff
. Tiêu chuẩn thực sự thay đổi với ecmascript 5, vì vậy các trình duyệt hiện đại không còn kích hoạt bát phân khi có số 0 đứng đầu nếu không có cơ số nào được chỉ định. parseInt hiểu các cơ số lên đến cơ sở 36, trong trường hợp đó cả chữ in hoa và chữ thường đều được coi là tương đương.
Thay đổi loại chuỗi thành số
Tất cả các thủ thuật khác được đề cập ở trên không sử dụng parseInt, liên quan đến việc ép buộc chuỗi thành một số. Tôi thích làm điều này rõ ràng,
var cast = Number("97");
Điều này có hành vi khác với các phương thức phân tích cú pháp (mặc dù nó vẫn bỏ qua khoảng trắng). Nó nghiêm ngặt hơn: nếu nó không hiểu toàn bộ chuỗi hơn là trả về NaN
, vì vậy bạn không thể sử dụng nó cho các chuỗi như thế nào 97px
. Vì bạn muốn có một số nguyên thủy thay vì một đối tượng trình bao Số, hãy đảm bảo rằng bạn không đặt new
trước hàm Số.
Rõ ràng, chuyển đổi thành Số mang lại cho bạn một giá trị có thể là số float thay vì số nguyên, vì vậy nếu bạn muốn số nguyên, bạn cần sửa đổi nó. Có một vài cách để làm điều này:
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
Bất kỳ toán tử bitwise nào (ở đây tôi đã thực hiện một bitwise hoặc, nhưng bạn cũng có thể thực hiện phủ định kép như trong câu trả lời trước đó hoặc bithift) sẽ chuyển đổi giá trị thành số nguyên 32 bit và hầu hết chúng sẽ chuyển đổi thành số nguyên đã ký. Lưu ý rằng điều này sẽ không muốn bạn muốn cho số nguyên lớn . Nếu số nguyên không thể được biểu diễn trong 32 bit, nó sẽ ngắt.
~~"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
Để hoạt động chính xác với số lượng lớn hơn, bạn nên sử dụng các phương pháp làm tròn
Math.floor("3000000000.654") === 3000000000
// This is the same as
Math.floor(Number("3000000000.654"))
Gấu nhớ rằng tất cả những phương pháp này hiểu ký hiệu mũ, vì vậy 2e2
là 200
hơn NaN. Ngoài ra, Number hiểu "Vô cực", trong khi các phương thức phân tích không.
Tập quán
Không chắc là một trong hai phương pháp này thực hiện chính xác những gì bạn muốn. Ví dụ: thông thường tôi sẽ muốn ném lỗi nếu phân tích cú pháp thất bại và tôi không cần hỗ trợ cho Infinity, hàm mũ hoặc khoảng trắng hàng đầu. Tùy thuộc vào usecase của bạn, đôi khi việc viết một hàm chuyển đổi tùy chỉnh sẽ rất hợp lý.
Luôn kiểm tra xem đầu ra của Số hoặc một trong các phương thức phân tích là loại số bạn mong đợi. Bạn gần như chắc chắn sẽ muốn sử dụng isNaN
để đảm bảo số đó không phải là NaN (thường là cách duy nhất bạn phát hiện ra rằng phân tích cú pháp thất bại).
97,8,00
và tương tự hay không. Một mẹo đơn giản là thực hiện một thao .replace(/[^0-9]/g, "")
tác sẽ loại bỏ tất cả các chữ số không có trong chuỗi của bạn và sau đó thực hiện chuyển đổi sau đó. Điều này tất nhiên sẽ bỏ qua tất cả các loại chuỗi điên mà bạn có thể nên mắc lỗi thay vì chỉ phân tích cú pháp ...
.replace(/[^0-9.]/g, "")
, nếu không "1.05" sẽ trở thành "105".
var fixed = Number("97.654").toFixed(0); // rounded rather than truncated
, chúng tôi nhận được một string
(vì .toFixed
phương thức) thay vì một number
(số nguyên). Nếu chúng ta muốn số nguyên được làm tròn, có lẽ tốt hơn là chỉ sử dụngMath.round("97.654");
Mặc dù một câu hỏi cũ, nhưng có lẽ điều này có thể hữu ích cho ai đó.
Tôi sử dụng cách chuyển đổi chuỗi thành số int
var str = "25"; // string
var number = str*1; // number
Vì vậy, khi nhân với 1, giá trị không thay đổi, nhưng js sẽ tự động trả về một số.
Nhưng như được hiển thị bên dưới, nên sử dụng số này nếu bạn chắc chắn rằng đó str
là một số (hoặc có thể được biểu diễn dưới dạng số), nếu không nó sẽ trả về NaN - không phải là số.
bạn có thể tạo chức năng đơn giản để sử dụng, vd
function toNumber(str) {
return str*1;
}
var x = "1000"*1;
Dưới đây là một chút so sánh về tốc độ (chỉ dành cho Mac Os) ... :)
Đối với chrome 'plus' và 'mul' là nhanh nhất (> 700.000,00 op / giây), 'Math.floor' là chậm nhất. Đối với Firefox, 'cộng' là chậm nhất (!) 'Mul' là nhanh nhất (> 900.000.000 op / giây). Trong Safari, 'parseInt' là fastes, 'number' là chậm nhất (nhưng resulats khá giống nhau,> 13.000.000 <31.000.000). Vì vậy, Safari cho cast cast to int chậm hơn 10 lần so với các trình duyệt khác. Vì vậy, người chiến thắng là ' mul ' :)
Bạn có thể chạy nó trên trình duyệt của mình bằng liên kết này https://jsperf.com/js-cast-str-to-number/1
Cập nhật
Tôi cũng kiểm tra var x = ~~"1000";
- trên Chrome và Safari chậm hơn một chút so với var x = "1000"*1
(<1%), trên Firefox nhanh hơn một chút (<1%). Tôi cập nhật hình ảnh trên và thử nghiệm
Hãy thử parseInt.
var number = parseInt("10", 10); //number will have value of 10.
Tôi đã đăng câu trả lời sai ở đây, xin lỗi. đã sửa.
Đây là một câu hỏi cũ, nhưng tôi thích thủ thuật này:
~~"2.123"; //2
~~"5"; //5
Âm hai bit giảm xuống bất cứ thứ gì sau dấu thập phân VÀ chuyển đổi nó thành định dạng số. Tôi đã nói rằng nó nhanh hơn một chút so với chức năng gọi và không có gì, nhưng tôi không hoàn toàn bị thuyết phục.
EDIT: Một phương pháp khác tôi vừa thấy ở đây (một câu hỏi về toán tử javascript >>>, đó là dịch chuyển bên phải bằng 0) cho thấy việc dịch chuyển một số bằng 0 với toán tử này sẽ chuyển đổi số thành uint32 , điều này rất tốt nếu bạn cũng muốn nó không dấu . Một lần nữa, điều này chuyển đổi thành một số nguyên không dấu , có thể dẫn đến các hành vi lạ nếu bạn sử dụng một số đã ký.
"-2.123" >>> 0; // 4294967294
"2.123" >>> 0; // 2
"-5" >>> 0; // 4294967291
"5" >>> 0; // 5
Cẩn thận nếu bạn sử dụng parseInt để chuyển đổi một dấu phẩy trong ký hiệu khoa học! Ví dụ:
parseInt("5.6e-14")
sẽ cho kết quả
5
thay vì
0
parseInt
sẽ không hoạt động đúng cho một float. parseFloat
hoạt động đúng trong trường hợp này.
Để chuyển đổi một Chuỗi thành Số nguyên, tôi khuyên bạn nên sử dụng parseFloat và KHÔNG parseInt. Đây là lý do tại sao:
Sử dụng parseFloat:
parseFloat('2.34cms') //Output: 2.34
parseFloat('12.5') //Output: 12.5
parseFloat('012.3') //Output: 12.3
Sử dụng phân tích cú pháp:
parseInt('2.34cms') //Output: 2
parseInt('12.5') //Output: 12
parseInt('012.3') //Output: 12
Vì vậy, nếu bạn đã nhận thấy parseInt loại bỏ các giá trị sau số thập phân, trong khi parseFloat cho phép bạn làm việc với các số dấu phẩy động và do đó phù hợp hơn nếu bạn muốn giữ lại các giá trị sau số thập phân. Sử dụng parseInt khi và chỉ khi bạn chắc chắn rằng bạn muốn giá trị nguyên.
Cũng như một lưu ý phụ: Mootools có chức năng toInt () được sử dụng trên bất kỳ chuỗi gốc nào (hoặc float (hoặc số nguyên)).
"2".toInt() // 2
"2px".toInt() // 2
2.toInt() // 2
SyntaxError
, bạn nên sử dụng dấu chấm kép, ví dụ: 2..toInt();
dấu chấm đầu tiên sẽ kết thúc biểu diễn của một Number
chữ và dấu chấm thứ hai là trình truy cập thuộc tính.
chúng ta có thể sử dụng +(stringOfNumber)
thay vì sử dụngparseInt(stringOfNumber)
Vd: +("21")
trả về int của 21 như parseInt("21")
.
chúng ta có thể sử dụng toán tử "+" unary này để phân tích cú pháp float ...
+
chứ?
parseInt
là. Một triển khai phổ biến là const myNumber = +myNumberAsAString
trông giống như một tiêu chuẩn +=
hoặc =+
toán tử thoạt nhìn. Ngoài ra Nếu sử dụng không chính xác, nó có thể dẫn đến lỗi nối. Giải pháp này dựa trên thực tế là 0 được coi là phía bên trái khi không có số nào được cung cấp.
Hãy thử str - 0
chuyển đổi string
sang 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
Dưới đây là hai liên kết để so sánh hiệu suất của một số cách để chuyển đổi chuỗi thành int
Có nhiều cách trong JavaScript để chuyển đổi một chuỗi thành một giá trị số ... Tất cả đều đơn giản và tiện dụng, hãy chọn cách thức nào phù hợp với bạn:
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
Ngoài ra, bất kỳ phép toán nào cũng chuyển đổi chúng thành số, ví dụ ...
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
Cách ưa thích của tôi là sử dụng +
dấu hiệu, đó là cách thanh lịch để chuyển đổi một chuỗi thành số trong JavaScript.
Google đã cho tôi câu trả lời này là kết quả, vì vậy ...
Tôi thực sự cần phải "lưu" một chuỗi dưới dạng một số nguyên, để liên kết giữa C và JavaScript, vì vậy tôi chuyển đổi chuỗi thành một giá trị số nguyên:
/*
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;
}
int2str
hàm của bạn dừng lại nếu một byte bằng 0, có thể là một phần tử hợp pháp trong giá trị, do đó if
... break
nên được loại bỏ để bạn nhận được giá trị 4 byte hoàn chỉnh.
Theo tôi, không có câu trả lời nào bao gồm tất cả các trường hợp cạnh vì phân tích cú pháp float sẽ dẫn đến lỗi.
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
parseInteger
, không phải parseNumber
. Tôi đoán mọi giải pháp là một cách giải quyết vì JS không hỗ trợ số nguyên và số float là các loại riêng biệt. Chúng tôi có thể quay lại null
thay vì NaN
, nếu Not A Number là sai lệch.
Đây là giải pháp đơn giản nhất
let myNumber = "123" | 0;
Giải pháp dễ dàng hơn
let myNumber = +"123";
Tất cả những điều trên là chính xác. Hãy chắc chắn trước đây rằng đây là một số trong một chuỗi bằng cách thực hiện "typeot x === 'number'" khác, nó sẽ trả về NaN
var num = "fsdfsdf242342";
typeof num => 'string';
var num1 = "12423";
typeof num1 => 'number';
+num1 = > 12423`
var num1 = "12423"; typeof num1;
trả về string
.
Tôi chỉ thêm một dấu cộng (+) trước chuỗi và đó là giải pháp!
+"052254" //52254
Hy vọng nó giúp ;)
Tổng các phép nhân các chữ số với lũy thừa tương ứng là mười:
tức là: 123 = 100 + 20 + 3 = 1 * 100 + 2 + 10 + 3 * 1 = 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;
}
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>
Cách an toàn nhất để đảm bảo bạn có được số nguyên hợp lệ:
let integer = (parseInt(value, 10) || 0);
Ví dụ:
// 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);
}
bạn có thể sử dụng dấu cộng, ví dụ =>
var personAge = '24'; var personAge1 = (+ personAge)
sau đó bạn có thể thấy typeof personAge là số