ฉันจะค้นหาความยาวของตัวเลขได้อย่างไร


161

ฉันต้องการความยาวของตัวเลขใน JavaScript หรือ jQuery หรือไม่

ฉันพยายามแล้วvalue.lengthไม่ประสบความสำเร็จฉันต้องแปลงเป็นสตริงก่อนหรือไม่?


3
ใช่แปลงเป็นสตริง แนวคิดของ "ความยาว" ของตัวเลขนั้นมีความหมายเฉพาะในแง่ของรูปแบบการแสดงตัวเลขบางอย่างเท่านั้น
Pointy

ใช่คุณต้องแปลงเป็นสตริงก่อน IE (1234) .toString (). length
Osama Bari

มาตรฐานสำหรับคำตอบ 3 อันดับแรก: measurethat.net/Benchmarks/ShowResult/92276
Richie Bendall

คำตอบ:


304
var x = 1234567;

x.toString().length;

กระบวนการนี้จะทำงานให้Float NumberและExponential numberยัง


9
+1 ในกรณีที่ไม่ชัดเจนสำหรับทุกคนจุดทศนิยมจะถูกนับในความยาวสตริง เช่น 2.5.toString () ความยาวผลลัพธ์ 3
dading84

1
@ dading84: ฉันเดา Math.floor () จะแก้ไขว่า: Math.floor (99.5454) .toString (). length === 2
Manfred

7
วิธีนี้จะใช้ไม่ได้กับจำนวนมากหรือน้อยที่มีมากกว่า 20 หลัก เช่น. 1.2e +22 toString (). ความยาวเอาต์พุต 7
CherylG

นอกจากนี้เมื่อต้องการทราบว่านี่ช้ามาก ฉันทำการทดสอบในโหนดและปรากฎว่ามันตอบช้ากว่า 1200% กว่า Arturs ตอบ
Oliver Dixon

1
มันไม่ใช่ทางออกที่ดีตัวอย่าง: const val = 0295; const x = val.toString (). ความยาว; console.log (x) // ผลลัพธ์คือ: 3
karolkarp

82

ตกลงคำตอบมากมาย แต่นี่เป็นคณิตศาสตร์ที่บริสุทธิ์เพียงเพื่อความสนุกสนานหรือเพื่อการจดจำว่าคณิตศาสตร์มีความสำคัญ:

var len = Math.ceil(Math.log(num + 1) / Math.LN10);

นี่จะให้ "ความยาว" ของตัวเลขแม้ว่ามันจะอยู่ในรูปแบบเลขชี้กำลัง numควรเป็นจำนวนเต็มไม่ใช่ลบที่นี่: ถ้าเป็นลบให้ใช้ค่าสัมบูรณ์ของมันและปรับเครื่องหมายในภายหลัง

อัพเดทสำหรับ ES2015

ตอนนี้Math.log10เป็นสิ่งที่คุณสามารถเขียน

const len = Math.ceil(Math.log10(num + 1));

1
ฉันคิดว่าคณิตศาสตร์อันบริสุทธิ์นี้มีประสิทธิภาพ / เร็วที่สุด
Noitidart

2
ขอบคุณชาย Awesme perf ผลลัพธ์ที่ฉันได้แสดงให้เห็นถึงวิธีการทางคณิตศาสตร์ที่รวดเร็วกว่านี่คือผลลัพธ์ที่คุณได้หรือไม่ นี่คือผลลัพธ์ของฉัน: i.imgur.com/9BKxyd3.png
Noitidart

1
@HubertGrzeskowiak โอ้เยี่ยมมาก ฉันเห็นว่าวิธีการนั้นเป็นวิชาคณิตศาสตร์อยู่แล้ว แต่ด้วยความรวดเร็ว มันลดลงMath.ceilและใช้เร็วขึ้นMath.absแทน แต่ฉันก็ไม่ได้คาดหวังว่าประสิทธิภาพจะเพิ่มขึ้นใน Chrome ... ยินดีที่ได้ทราบ!
MaxArt

3
สมบูรณ์แบบ แต่ให้ 0 ถ้าเจ้าเลขเป็น 0 แทน 1
StateLess

1
ที่ 1e + 16 หรือมากกว่านั้นจะให้ 1 น้อยกว่าดังนั้น 10000000000000000 จะส่งกลับ 16 แทน 17 เป็นต้นไป ...
Goty Metal

12

ฉันใช้ฟังก์ชันนี้ใน node.js นี่เป็นการใช้งานที่เร็วที่สุดของฉัน:

var nLength = function(n) { 
    return (Math.log(Math.abs(n)+1) * 0.43429448190325176 | 0) + 1; 
}

มันควรจัดการกับจำนวนเต็มบวกและลบ (เช่นเดียวกับในรูปแบบเลขชี้กำลัง) และควรกลับความยาวของส่วนจำนวนเต็มในลอย

การอ้างอิงต่อไปนี้ควรให้ข้อมูลเชิงลึกเกี่ยวกับวิธีการ: Weisstein, Eric W. "Number Length" จาก MathWorld - ทรัพยากรเว็บ Wolfram

ฉันเชื่อว่าการดำเนินการระดับบิตสามารถแทนที่ Math.abs ได้ แต่ jsperf แสดงว่า Math.abs ทำงานได้ดีในเครื่องยนต์ js ส่วนใหญ่

อัปเดต : ตามที่ระบุไว้ในความคิดเห็นการแก้ปัญหานี้มีปัญหาบางอย่าง:(

Update2 (วิธีแก้ปัญหา) : ฉันเชื่อว่าในบางประเด็นความแม่นยำจะเริ่มขึ้นและคนที่Math.log(...)*0.434...ทำงานอย่างกะทันหัน อย่างไรก็ตามหากอุปกรณ์ Internet Explorer หรืออุปกรณ์พกพาไม่ใช่ถ้วยน้ำชาของคุณคุณสามารถแทนที่การดำเนินการนี้ด้วยMath.log10ฟังก์ชันได้ ใน Node.js ฉันเขียนการทดสอบพื้นฐานอย่างรวดเร็วด้วยฟังก์ชั่นnLength = (n) => 1 + Math.log10(Math.abs(n) + 1) | 0;และMath.log10ทำงานได้อย่างที่คาดไว้ โปรดทราบว่าMath.log10ไม่รองรับในระดับสากล


ในฐานะที่เป็นความอยากรู้ฉันได้ทำ JsPerf ด้วยวิธี nLength vs toString () ความยาวในเรื่องนี้ .... jsperf.com/convert-number-to-string-and-get-length/2
Israfil Havilah

ฮ่าฮ่ามันเป็นคำตอบที่ฉันให้! ฉันไม่รู้ว่ามันจะทำงานได้ดี
MaxArt

2
ฉันขอโทษที่ฉันพูดบางสิ่งเกี่ยวกับตัวฉันประดิษฐ์วิธีแก้ปัญหาหรืออะไรแบบนั้น ทำไมคุณไม่อ่านอย่างละเอียดก่อนโพสต์? สำหรับเรื่องดังกล่าว algorhythm นั้นถูกค้นพบก่อนที่ Steven Wolfram จะเกิดและหน้าเว็บที่คุณเชื่อมโยงนั้นไม่ได้ให้วิธีแก้ปัญหาใน Javascript ฉันทำไปแล้ว 9 เดือนก่อนคุณ
MaxArt

1
"+1" น่าจะอยู่นอกการโทร Math.abs: Math.log (Math.abs (n) + 1) ...
Hubert Grzeskowiak

1
ที่ 1e + 16 หรือมากกว่านั้นจะให้ 1 น้อยกว่าดังนั้น 10000000000000000 จะส่งกลับ 16 แทน 17 เป็นต้นไป ...
Goty Metal

11

คุณต้องทำตัวเลขให้เป็นสตริงเพื่อให้มีความยาว

var num = 123;

alert((num + "").length);

หรือ

alert(num.toString().length);

9

ยังสามารถใช้สตริงแม่แบบ:

const num = 123456
`${num}`.length // 6

นี่เป็นคำตอบเดียวที่เหมาะกับฉันเพราะฉันนับจำนวนที่ขึ้นต้นด้วย 0.
jessiPP

5

ถ้าไม่มีการแปลงจำนวนเต็มเป็นสตริงคุณสามารถสร้างวงวนขี้ขลาด:

var number = 20000;
var length = 0;
for(i = number; i > 1; ++i){
     ++length;
     i = Math.floor(i/10);
}

alert(length);​

การสาธิต: http://jsfiddle.net/maniator/G8tQE/


3
@Pointy ใช่นี้เป็นสมมติจำนวนเต็ม แม้ว่าคุณจะทำให้มันเป็นสตริงมันจะรวม.เป็นส่วนหนึ่งของการคำนวณ
Naftali aka Neal

ใช่แม้ว่ามันจะเป็นคำถามเชิงปรัชญาที่น่าสนใจหรือไม่ว่าควรรวมจุดนั้นไว้ใน "ความยาว" :-)
Pointy

4

ก่อนอื่นแปลงเป็นสตริง:

var mynumber = 123;
alert((""+mynumber).length);

การเพิ่มสตริงว่างให้มันจะทำให้mynumberกลายเป็นสตริงโดยปริยาย


1
ไม่ทำงานกับเลขชี้กำลังเช่น 1e + 16 ซึ่งคืนค่า 5
Goty Metal

4

มีสามวิธีในการทำ

var num = 123;
alert(num.toString().length);

ประสิทธิภาพที่ดีขึ้นหนึ่ง (ประสิทธิภาพที่ดีที่สุดใน ie11)

var num = 123;
alert((num + '').length);

คณิตศาสตร์ (ประสิทธิภาพที่ดีที่สุดใน Chrome, firefox แต่ช้าที่สุดคือ 11)

var num = 123
alert(Math.floor( Math.log(num) / Math.LN10 ) + 1)

มี jspref ที่นี่ http://jsperf.com/fastest-way-to-get-the-first-in-a-number/2


4

คุณควรไปหาสิ่งที่ง่ายที่สุด (stringLength) การอ่านจะเต้นเร็วเสมอ แต่ถ้าคุณสนใจความเร็วนี่คือบางส่วนด้านล่าง

สามวิธีที่ต่างกันทั้งหมดด้วยความเร็วที่แตกต่างกัน

// 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);
}

3

ฉันถูกถามคำถามที่คล้ายกันในการทดสอบ

ค้นหาความยาวของตัวเลขโดยไม่แปลงเป็นสตริง

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 ]

มีการเพิ่มจำนวนลบเพื่อทำให้ซับซ้อนขึ้นอีกเล็กน้อยดังนั้น Math.abs ()


2

ฉันต้องการแก้ไขคำตอบ @Neal ซึ่งค่อนข้างดีสำหรับจำนวนเต็ม แต่ตัวเลข 1 จะส่งกลับค่าความยาวเป็น 0 ในกรณีก่อนหน้า

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;
}


0

ใช่คุณต้องแปลงเป็นสตริงเพื่อค้นหาความยาวตัวอย่างเช่น

var x=100;// type of x is number
var x=100+"";// now the type of x is string
document.write(x.length);//which would output 3.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.