Saya ingin mendapatkan panjang angka dalam JavaScript atau jQuery?
Saya sudah mencoba value.lengthtanpa hasil, apakah saya perlu mengonversinya menjadi string terlebih dahulu?
Saya ingin mendapatkan panjang angka dalam JavaScript atau jQuery?
Saya sudah mencoba value.lengthtanpa hasil, apakah saya perlu mengonversinya menjadi string terlebih dahulu?
Jawaban:
var x = 1234567;
x.toString().length;
Proses ini juga akan bekerja untuk Float Numberdan untuk Exponential numberjuga.
Ok, begitu banyak jawaban, tetapi ini adalah matematika murni, hanya untuk bersenang-senang atau mengingat bahwa Matematika itu Penting:
var len = Math.ceil(Math.log(num + 1) / Math.LN10);
Ini sebenarnya memberikan "panjang" angka bahkan jika itu dalam bentuk eksponensial. numseharusnya bilangan bulat bukan negatif di sini: jika bilangan negatif, ambil nilai absolutnya dan sesuaikan tanda setelahnya.
Sekarang Math.log10adalah suatu hal , Anda cukup menulis
const len = Math.ceil(Math.log10(num + 1));
Math.ceildan menggunakan yang lebih cepat Math.abssebagai gantinya. Tapi sejujurnya saya tidak mengharapkan kenaikan kinerja di Chrome ... Senang tahu!
Saya telah menggunakan fungsi ini di node.js, ini adalah implementasi tercepat saya sejauh ini:
var nLength = function(n) {
return (Math.log(Math.abs(n)+1) * 0.43429448190325176 | 0) + 1;
}
Ini harus menangani bilangan bulat positif dan negatif (juga dalam bentuk eksponensial) dan harus mengembalikan panjang bagian bilangan bulat dalam pelampung.
Referensi berikut harus memberikan beberapa wawasan tentang metode ini: Weisstein, Eric W. "Panjang Angka." Dari MathWorld - Sumber Daya Web Wolfram.
Saya percaya bahwa beberapa operasi bitwise dapat menggantikan Math.abs, tetapi jsperf menunjukkan bahwa Math.abs bekerja dengan baik di sebagian besar mesin js.
Pembaruan : Seperti disebutkan dalam komentar, solusi ini memiliki beberapa masalah :(
Update2 (pemecahan masalah) : Saya percaya bahwa pada suatu titik masalah presisi muncul dan orang yang Math.log(...)*0.434...berperilaku tidak terduga. Namun, jika Internet Explorer atau perangkat Mobile bukan secangkir teh Anda, Anda dapat mengganti operasi ini dengan Math.log10fungsinya. Di Node.js saya menulis tes dasar cepat dengan fungsi nLength = (n) => 1 + Math.log10(Math.abs(n) + 1) | 0;dan dengan Math.log10itu berfungsi seperti yang diharapkan. Harap dicatat bahwa Math.log10tidak didukung secara universal.
Baik tanpa mengonversi bilangan bulat menjadi string, Anda dapat membuat lingkaran yang funky:
var number = 20000;
var length = 0;
for(i = number; i > 1; ++i){
++length;
i = Math.floor(i/10);
}
alert(length);
.sebagai bagian dari perhitungan.
Konversikan dulu menjadi string:
var mynumber = 123;
alert((""+mynumber).length);
Menambahkan string kosong ke dalamnya akan secara implisit menyebabkan mynumberberubah menjadi string.
Ada tiga cara untuk melakukannya.
var num = 123;
alert(num.toString().length);
kinerja yang lebih baik (kinerja terbaik dalam ie11)
var num = 123;
alert((num + '').length);
Matematika (kinerja terbaik di Chrome, firefox tetapi paling lambat di ie11)
var num = 123
alert(Math.floor( Math.log(num) / Math.LN10 ) + 1)
ada jspref di sini http://jsperf.com/fastest-way-to-get-the-first-in-a-nn//
Anda harus menggunakan yang paling sederhana (stringLength), keterbacaan selalu mengalahkan kecepatan. Tetapi jika Anda peduli kecepatan di sini ada beberapa di bawah ini.
Tiga metode berbeda semuanya dengan kecepatan yang bervariasi.
// 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);
}
Saya mendapat pertanyaan serupa dalam tes.
Temukan panjang angka tanpa mengubahnya menjadi string
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 ]
Angka negatif ditambahkan untuk mempersulitnya sedikit lebih, maka Math.abs ().
Saya ingin memperbaiki jawaban @Neal yang cukup bagus untuk bilangan bulat, tetapi angka 1 akan mengembalikan panjang 0 pada kasus sebelumnya.
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;
}