Tôi đang tìm cách lấy độ dài của một số trong JavaScript hoặc jQuery?
Tôi đã thử value.length
mà không thành công, tôi có cần chuyển chuỗi này thành chuỗi trước không?
Tôi đang tìm cách lấy độ dài của một số trong JavaScript hoặc jQuery?
Tôi đã thử value.length
mà không thành công, tôi có cần chuyển chuỗi này thành chuỗi trước không?
Câu trả lời:
var x = 1234567;
x.toString().length;
Quá trình này cũng sẽ làm việc cho Float Number
và Exponential number
cũng cho .
Ok, rất nhiều câu trả lời, nhưng đây là một bài toán thuần túy, chỉ để giải trí hoặc để nhớ rằng Toán học là Quan trọng:
var len = Math.ceil(Math.log(num + 1) / Math.LN10);
Điều này thực sự mang lại "độ dài" của số ngay cả khi nó ở dạng hàm mũ. num
được coi là một số nguyên không âm ở đây: nếu nó âm, lấy giá trị tuyệt đối của nó và điều chỉnh dấu sau đó.
Bây giờ đó Math.log10
là một điều , bạn chỉ cần viết
const len = Math.ceil(Math.log10(num + 1));
Math.ceil
và sử dụng nhanh hơn Math.abs
thay thế. Nhưng tôi thực sự không mong đợi rằng hiệu suất đạt được trong Chrome ... Rất vui được biết!
Tôi đã sử dụng chức năng này trong node.js, đây là cách triển khai nhanh nhất của tôi cho đến nay:
var nLength = function(n) {
return (Math.log(Math.abs(n)+1) * 0.43429448190325176 | 0) + 1;
}
Nó nên xử lý các số nguyên dương và âm (cũng ở dạng hàm mũ) và sẽ trả về độ dài của phần nguyên trong số float.
Tài liệu tham khảo sau đây sẽ cung cấp một số cái nhìn sâu sắc về phương pháp: Weisstein, Eric W. "Số chiều dài." Từ MathWorld - Một tài nguyên web Wolfram.
Tôi tin rằng một số thao tác bitwise có thể thay thế Math.abs, nhưng jsperf cho thấy Math.abs hoạt động tốt trong phần lớn các công cụ js.
Cập nhật : Như đã lưu ý trong các nhận xét, giải pháp này có một số vấn đề :(
Update2 (cách giải quyết) : Tôi tin rằng tại một số điểm, các vấn đề chính xác sẽ xảy ra và Math.log(...)*0.434...
chỉ hành xử bất ngờ. Tuy nhiên, nếu Internet Explorer hoặc thiết bị di động không phải là tách trà của bạn, bạn có thể thay thế thao tác này bằng Math.log10
chức năng. Trong Node.js tôi đã viết một bài kiểm tra cơ bản nhanh chóng với hàm nLength = (n) => 1 + Math.log10(Math.abs(n) + 1) | 0;
và với Math.log10
nó hoạt động như mong đợi. Xin lưu ý rằng Math.log10
không được hỗ trợ phổ biến.
Vâng, không cần chuyển đổi số nguyên thành một chuỗi, bạn có thể tạo một vòng lặp thú vị:
var number = 20000;
var length = 0;
for(i = number; i > 1; ++i){
++length;
i = Math.floor(i/10);
}
alert(length);
Bản trình diễn: http://jsfiddle.net/manoder/G8tQE/
.
như là một phần của phép tính.
Đầu tiên chuyển đổi nó thành một chuỗi:
var mynumber = 123;
alert((""+mynumber).length);
Thêm một chuỗi trống vào nó sẽ khiến chúng mynumber
biến thành một chuỗi.
Có ba cách để làm điều đó.
var num = 123;
alert(num.toString().length);
hiệu suất tốt hơn một (hiệu suất tốt nhất trong eg11)
var num = 123;
alert((num + '').length);
Toán học (hiệu suất tốt nhất trong Chrome, firefox nhưng chậm nhất là eg11)
var num = 123
alert(Math.floor( Math.log(num) / Math.LN10 ) + 1)
có một jspref ở đây http://jsperf.com/fastest-way-to-get-the-first-in-a-number/2
Bạn nên đi đơn giản nhất (chuỗiLL), khả năng đọc luôn vượt qua tốc độ. Nhưng nếu bạn quan tâm về tốc độ thì đây là một số dưới đây.
Ba phương pháp khác nhau với tốc độ khác nhau.
// 34ms
let weissteinLength = function(n) {
return (Math.log(Math.abs(n)+1) * 0.43429448190325176 | 0) + 1;
}
// 350ms
let stringLength = function(n) {
return n.toString().length;
}
// 58ms
let mathLength = function(n) {
return Math.ceil(Math.log(n + 1) / Math.LN10);
}
// Simple tests below if you care about performance.
let iterations = 1000000;
let maxSize = 10000;
// ------ Weisstein length.
console.log("Starting weissteinLength length.");
let startTime = Date.now();
for (let index = 0; index < iterations; index++) {
weissteinLength(Math.random() * maxSize);
}
console.log("Ended weissteinLength length. Took : " + (Date.now() - startTime ) + "ms");
// ------- String length slowest.
console.log("Starting string length.");
startTime = Date.now();
for (let index = 0; index < iterations; index++) {
stringLength(Math.random() * maxSize);
}
console.log("Ended string length. Took : " + (Date.now() - startTime ) + "ms");
// ------- Math length.
console.log("Starting math length.");
startTime = Date.now();
for (let index = 0; index < iterations; index++) {
mathLength(Math.random() * maxSize);
}
Tôi đã hỏi một câu hỏi tương tự trong một bài kiểm tra.
Tìm độ dài của một số mà không chuyển đổi thành chuỗi
const numbers = [1, 10, 100, 12, 123, -1, -10, -100, -12, -123, 0, -0]
const numberLength = number => {
let length = 0
let n = Math.abs(number)
do {
n /= 10
length++
} while (n >= 1)
return length
}
console.log(numbers.map(numberLength)) // [ 1, 2, 3, 2, 3, 1, 2, 3, 2, 3, 1, 1 ]
Các số âm được thêm vào để làm phức tạp thêm một chút, do đó Math.abs ().
Tôi muốn sửa câu trả lời @Neal khá tốt cho số nguyên, nhưng số 1 sẽ trả về độ dài bằng 0 trong trường hợp trước.
function Longueur(numberlen)
{
var length = 0, i; //define `i` with `var` as not to clutter the global scope
numberlen = parseInt(numberlen);
for(i = numberlen; i >= 1; i)
{
++length;
i = Math.floor(i/10);
}
return length;
}