Câu hỏi Làm thế 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 string vào một integer trong JavaScript?


1376
2017-07-15 20:22


gốc


Sử dụng try { Number(str) } catch (e) { } để chuyển đổi một chuỗi một cách an toàn thành một số nếu nó là một số và thất bại nếu nó không phải là số. Số lưu trữ 16 chữ số và một khoảng thời gian nhiều nhất, bất kể 16 chữ số ở đâu. Các chữ số quan trọng nhất được giữ lại và các chữ số còn lại được làm tròn. Sau đó, bạn có thể chuyển đổi, tròn, vv Số (str) để định dạng số bất kỳ bạn vui lòng. - Andrew


Các câu trả lời:


Cách đơn giản nhất là sử dụng nguồn gốc Number chức năng:

var x = Number("1000")

Nếu điều đó không hiệu quả với bạn, thì có parseInt, cộng nhất, parseFloat với sànMath.round phương pháp.

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

cộng nhất 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à một phao 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 định sử dụng Math.floor nhiều lần:

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

Nếu bạn là loại người quên đặt bản gốc vào 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 sử dụng sàn.

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

Điều thú vị là Math.round (như Math.floor) sẽ làm một chuỗi để chuyển đổi số, vì vậy nếu bạn muốn số được làm tròn (hoặc nếu bạn có một 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)

1751
2017-07-15 20:28



Cái gì thế valueOf cho? Đối với chuỗi, nó trả về chính chuỗi đó. - pimvdb
Làm thế nào về "1000" * 1? - idophir
Bạn cũng có thể dùng: Number("1000") cho loại chuyển đổi này - eliocs
Bạn quên đề cập đến ~~. ~~"1" === 1, ~~1.6 === 1  ~~-1.6 === -1, ~~undefined === 0 (như vậy là NaN và Infinity và bất kỳ thứ gì khác không thể chuyển đổi thành một số nguyên) - Tomalak
Tại sao không sử dụng đơn giản Number("1000")?? - TMS


Thử hàm 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 cách sử dụng hàm parseInt, nó 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 là 10.

parseInt(string, radix)

Thí dụ:

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

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

193
2017-07-15 20:23



Radix không còn được yêu cầu trong năm 2016.
Nó có thể không dành cho các trình duyệt mới hơn nhưng vẫn yêu cầu cơ chế cho khả năng tương thích ngược. - Bonner 웃
điều gì về '' hoặc '02 'hoặc' 02 + 1 'hoặc' 03,12 'hoặc' 03.12 '? - stackdave
Lưu ý rằng điều này bỏ qua dữ liệu xấu sau số. Ví dụ, parseInt('0asdf', 10) sản xuất 0. - Sam


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 nó và cách khác là thay đổi kiểu của nó thành một Số. Tất cả các thủ thuật trong các câu trả lời khác (ví dụ: cộng thêm) liên quan đến việc ngầm xuyên xâu chuỗi của chuỗi vào 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 Số.

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 các số. Phân tích cú pháp sẽ dừng âm thầm nếu nó chạm vào ký tự mà nó không nhận ra, điều này có thể hữu ích khi phân tích chuỗi như "92px", nhưng cũng hơi nguy hiểm vì nó sẽ không cung cấp cho bạn bất kỳ lỗi nào về đầu vào kém, thay vào đó bạn sẽ lấy lại NaN trừ khi chuỗi bắt đầu bằng một số. Khoảng trống ở đầu chuỗi bị bỏ qua. Dưới đây là một ví dụ về nó làm một cái gì đó khác với những gì bạn muốn, và đưa ra không có dấu hiệu cho thấy bất cứ điều gì đã đi sai:

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

Thực hành tốt là luôn luôn chỉ định cơ số làm đối số thứ hai. Trong các trình duyệt cũ hơn, nếu chuỗi bắt đầu bằng 0, chuỗi này sẽ được hiểu là bát phân nếu cơ số không được chỉ định khiến nhiều người bất ngờ. 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ó chỉ định nào đượ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ó 0 hàng đầu nếu không có chỉ định nào được xác định. parseInt hiểu các bản sao lên đến cơ sở 36, trong trường hợp cả chữ hoa và chữ thường được coi là tương đương.

Thay đổi loại chuỗi thành một 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 ngầm xâu chuỗi vào một số. Tôi thích làm điều này một cách rõ ràng,

var cast = Number("97");

Điều này có hành vi khác nhau đối 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à nó trả về NaN, vì vậy bạn không thể sử dụng nó cho các chuỗi như 97px. Vì bạn muốn một số nguyên thủy chứ không phải là một đối tượng bao bọc số, hãy chắc chắn bạn không đặt new ở phía trước của hàm Số.

Rõ ràng, việc chuyển đổi sang một số cho bạn một giá trị có thể là một float thay vì một số nguyên, vì vậy nếu bạn muốn một số nguyên, bạn cần phải sửa đổi nó. Có một số 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 bitwise hoặc, nhưng bạn cũng có thể làm đôi phủ định như trong câu trả lời trước hoặc bithift) sẽ chuyển giá trị thành số nguyên 32 bit và hầu hết trong số chúng sẽ chuyển 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ẽ được bọc.

~~"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

Để làm việc chính xác với số lượng lớn hơn, bạn nên sử dụng phương pháp làm tròn

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

Hãy nhớ rằng tất cả các phương thức này đều hiểu ký hiệu hàm mũ, vì vậy 2e2 Là 200 thay vì NaN. Ngoài ra, Number hiểu "Infinity", trong khi các phương thức phân tích thì không.

Tập quán

Nó không chắc rằng một trong những phương pháp này làm chính xác những gì bạn muốn. Ví dụ, thông thường tôi sẽ muốn một lỗi được ném nếu phân tích cú pháp không thành công, và tôi không cần hỗ trợ cho Infinity, exponentials hoặc khoảng trắng hàng đầu. Tùy thuộc vào việc sử dụng của bạn, đôi khi nó có ý nghĩa để viết một hàm chuyển đổi tùy chỉnh.

Luôn kiểm tra rằng đầu ra của Số hoặc một trong các phương thức phân tích cú pháp 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 không thành công).


108
2017-12-11 07:47



Nó phụ thuộc vào việc bạn muốn mã của bạn cũng chấp nhận 97,8,00 và tương tự hay không. Một mẹo đơn giản là làm một .replace(/[^0-9]/g, "") sẽ xóa tất cả các chữ số không khỏi 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 dây điên mà bạn có lẽ nên lỗi trên chứ không chỉ là phân tích cú pháp ... - kybernetikos
@kybernetikos có lẽ nên .replace(/[^0-9.]/g, ""), nếu không "1,05" sẽ trở thành "105". - J.Steve
Hoàn toàn đúng, mặc dù tôi sẽ không sử dụng một cái gì đó như thế cho mã quan trọng anyway - có rất nhiều cách nó có thể cho phép một cái gì đó thông qua bạn thực sự không muốn để cho qua. - kybernetikos
Tôi tìm thấy bằng cách sử dụng số nhiều hơn nữa có thể đọc được trong mã vì vậy cảm ơn bạn đã chỉ nó ra như là một giải pháp. - carlin.scott
@kybernetikos In var fixed = Number("97.654").toFixed(0); // rounded rather than truncated, chúng tôi đang nhận được string (vì .toFixed phương thức) thay vì number (số nguyên). Nếu chúng ta muốn số nguyên tròn thì có lẽ tốt hơn là chỉ sử dụng Math.round("97.654"); - Edu Zamora


ParseInt () và + khác nhau

parseInt("10.3456") // returns 10

+"10.3456" // returns 10.3456

50
2018-03-14 09:54





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 này để chuyển đổi chuỗi thành int con số

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ư nó được hiển thị dưới đây, điều này nên được sử dụng 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, ví dụ:

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

enter image description here


35
2018-03-16 18:24





Thử parseInt.

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

31
2017-07-15 20:23



Bạn có thể muốn bao gồm cơ số với điều đó, quá: var number = parseInt ("10", 10); - Joel Coehoorn


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 mẹo này:

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

Các bitwise âm đôi giảm xuống bất cứ điều gì sau khi dấu thập phân và chuyển đổi nó thành một định dạng số. Tôi đã nói với nó nhanh hơn một chút so với các chức năng gọi điện thoại và điều gì đó, nhưng tôi không hoàn toàn bị thuyết phục.

EDIT: Một phương pháp tôi vừa thấy đây (một câu hỏi về toán tử javascript >>>, đó là một sự dịch chuyển số không đầy) cho thấy rằng dịch chuyển một số bằng 0 với toán tử này chuyển đổi số thành một uint32 đó là tốt đẹp nếu bạn cũng muốn nó chưa ký. Một lần nữa, điều này chuyển đổi thành số nguyên không dấu, có thể dẫn đến hành vi lạ nếu bạn sử dụng số đã ký.

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

25
2018-01-16 09:51