รับจำนวนหลักด้วย JavaScript


124

เป็นชื่อของโพสต์ของฉันแนะนำผมอยากจะทราบว่าหลายตัวเลขvar numberมี ตัวอย่างเช่นหากฟังก์ชั่นของฉันควรกลับnumber = 15; 2ปัจจุบันมีลักษณะดังนี้:

function getlength(number) {
  return number.toString().length();
}

แต่ Safari แจ้งว่าใช้งานไม่ได้เนื่องจากTypeError:

'2' is not a function (evaluating 'number.toString().length()')

อย่างที่คุณเห็น'2'เป็นทางออกที่ถูกต้อง แต่ทำไมล่ะnot a function?

คำตอบ:


229

lengthเป็นคุณสมบัติไม่ใช่วิธีการ คุณไม่สามารถเรียกมันได้ดังนั้นคุณไม่จำเป็นต้องมีวงเล็บ():

function getlength(number) {
    return number.toString().length;
}

อัปเดต:ตามที่กล่าวไว้ในความคิดเห็นตัวอย่างข้างต้นใช้ไม่ได้กับตัวเลขลอย เพื่อให้เราทำงานอย่างใดอย่างหนึ่งสามารถได้รับการกำจัดของระยะเวลาการมีหรือนับตัวเลขที่มีการแสดงออกปกติ:String(number).replace('.', '').lengthString(number).match(/\d/g).length

ในแง่ของความเร็วอาจเป็นวิธีที่เร็วที่สุดในการรับจำนวนหลักในจำนวนที่กำหนดคือการคำนวณทางคณิตศาสตร์ สำหรับจำนวนเต็มบวกมีอัลกอริทึมที่ยอดเยี่ยมซึ่งประกอบด้วยlog10:

var length = Math.log(number) * Math.LOG10E + 1 | 0;  // for positive integers

สำหรับจำนวนเต็มทุกประเภท (รวมทั้งเชิงลบ) มีโซลูชันที่ได้รับการปรับให้เหมาะสมอย่างยอดเยี่ยมจาก@ Mwr247แต่โปรดใช้ความระมัดระวังMath.log10เนื่องจากเบราว์เซอร์เดิมจำนวนมากไม่รองรับ ดังนั้นแทนที่Math.log10(x)ด้วยMath.log(x) * Math.LOG10Eจะช่วยแก้ปัญหาความเข้ากันได้

การสร้างคำตอบทางคณิตศาสตร์ที่รวดเร็วสำหรับเลขฐานสิบไม่ใช่เรื่องง่ายเนื่องจากพฤติกรรมที่เป็นที่รู้จักกันดีของเลขทศนิยมดังนั้นวิธีการร่ายต่อสตริงจะง่ายกว่าและพิสูจน์ไม่ได้ ดังที่ได้กล่าวไว้โดย@streetlogics การแคสต์อย่างรวดเร็วสามารถทำได้โดยใช้ตัวเลขอย่างง่ายต่อการต่อสตริงซึ่งจะทำให้โซลูชันการแทนที่เปลี่ยนเป็น:

var length = (number + '').replace('.', '').length;  // for floats

3
เทคนิคที่ดีในการไม่ได้ตัวเลข แต่ถ้าเป็นเลขเศษส่วนเช่น 12.5 ฟังก์ชันของคุณจะส่งกลับ 4 แทนที่จะเป็น 3 ...
Swarnendu Paul

@Swarnendu: นั่นไม่มีปัญหาเพราะฉันมีแค่จำนวนเต็ม
bit4fox

3
number.toString().match(/\d/g).lengthมิฉะนั้นเพียงแค่ใช้สิ่งที่ต้องการ
VisioN

1
@ Bakudan - คำตอบนี้ได้รับการแก้ไขแล้ว คุณสามารถลบสองความคิดเห็นของคุณที่วิพากษ์วิจารณ์ได้ตอนนี้ (เพื่อไม่ให้คนในอนาคตสับสนและคิดว่าโค้ดในคำตอบนี้ใช้ไม่ได้)
ArtOfWarfare

1
@ 3ocene เดาดี! ค่าจะยังคงเหมือนเดิม แต่ด้านหลังฉากจะถูกเหวี่ยงเป็นจำนวนเต็ม x | 0เป็นอีกเวอร์ชันที่สั้นและรวดเร็วMath.floor(x)ซึ่งจะปัดเศษลง คุณสามารถบรรลุสิ่งเดียวกันกับ~~x. คำถามต่อไปนี้ให้คำอธิบายเพิ่มเติมเกี่ยวกับประเด็น: stackoverflow.com/q/9049677/1249581
VisioN

66

นี่คือคำตอบทางคณิตศาสตร์ (ใช้ได้กับจำนวนลบด้วย):

function numDigits(x) {
  return Math.max(Math.floor(Math.log10(Math.abs(x))), 0) + 1;
}

และเวอร์ชันที่ปรับให้เหมาะสมแล้วข้างต้น (การดำเนินการระดับบิตที่มีประสิทธิภาพมากขึ้น):

function numDigits(x) {
  return (Math.log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1;
}

โดยพื้นฐานแล้วเราเริ่มต้นด้วยการรับค่าสัมบูรณ์ของอินพุตเพื่อให้ค่าเชิงลบทำงานได้อย่างถูกต้อง จากนั้นเราจะเรียกใช้การดำเนินการ log10 เพื่อให้ค่ากำลังของ 10 อินพุตเป็นเท่าใด (ถ้าคุณทำงานในฐานอื่นคุณจะใช้ลอการิทึมสำหรับฐานนั้น) ซึ่งเป็นจำนวนหลัก จากนั้นเราจะปูพื้นผลลัพธ์เพื่อจับเฉพาะส่วนจำนวนเต็มของสิ่งนั้น สุดท้ายเราใช้ฟังก์ชัน max เพื่อแก้ไขค่าทศนิยม (ค่าเศษส่วนใด ๆ ระหว่าง 0 ถึง 1 จะส่งกลับ 1 แทนที่จะเป็นจำนวนลบ) และเพิ่ม 1 ในผลลัพธ์สุดท้ายเพื่อรับการนับ

ข้างต้นถือว่า (ตามตัวอย่างที่คุณป้อน) ว่าคุณต้องการนับจำนวนหลักเป็นจำนวนเต็ม (ดังนั้น 12345 = 5 ดังนั้น 12345.678 = 5 เช่นกัน) หากคุณต้องการนับจำนวนตัวเลขทั้งหมดในค่า (ดังนั้น 12345.678 = 8) ให้เพิ่มก่อน 'return' ในฟังก์ชันใดฟังก์ชันหนึ่งด้านบน:

x = Number(String(x).replace(/[^0-9]/g, ''));

3
หมายเหตุ: Math.log10 เป็นผู้พัฒนา
Tx3

2
@ Tx3 หมายเหตุดี! โชคดีที่Math.LOG10Eมีมาตั้งแต่ ES1 ซึ่งหมายความว่าMath.log(x) * Math.LOG10Eจะทำงานร่วมกันได้
Mwr247

ฉันคิดว่าฟังก์ชันนี้ใช้ไม่ได้: `` function numDigits (x) {return (Math.log10 ((x ^ (x >> 31)) - (x >> 31)) | 0) + 1; } `` numDigits (1234567891) -> 10 numDigits (12345678912) -> 9
lokhmakov

@lokhmakov นั่นเป็นเพราะตัวเลขที่สองที่คุณให้นั้นเกินค่าจำนวนเต็ม 32 บิตสูงสุดของ JavaScript ซึ่งตัวดำเนินการระดับบิต (^, >>, |) ไม่สามารถจัดการได้อย่างถูกต้อง
Mwr247

1
จริง เราควรคาดหวังว่า JS จะใช้งานได้กับ max safe int เท่านั้นและตัวเลขนั้นมีขนาดใหญ่กว่าที่ทุกคนต้องการ ฉันกำลังพัฒนาเกมที่มีตัวเลขจำนวนมากและไม่สามารถใช้โค้ดที่ปรับให้เหมาะสมได้เนื่องจากข้อ จำกัด นั้นและคิดว่าฉันจะแสดงความคิดเห็นเพื่อช่วยคนอื่นในเรือที่คล้ายกันไม่ให้มีโค้ดเสียในภายหลัง คำตอบที่ดีโดยวิธีการ
จัสติน

20

เนื่องจากสิ่งนี้เกิดขึ้นในการค้นหา "javascript รับจำนวนหลัก" ของ Google ฉันจึงอยากจะบอกว่ามีทางเลือกที่สั้นกว่านี้ซึ่งต้องอาศัยการคัดเลือกภายในที่จะดำเนินการให้คุณ:

var int_number = 254;
var int_length = (''+int_number).length;

var dec_number = 2.12;
var dec_length = (''+dec_number).length;

console.log(int_length, dec_length);

อัตราผลตอบแทน

3 4

4
และ jsperf อย่างรวดเร็วแสดงให้เห็นว่านี่เร็วกว่ามากเช่นกัน (เช่น 10x ขึ้นไป): jsperf.com/number-tostring-vs-number
Ledivin

บันทึก! นับจุดเป็นตัวเลขด้วย (ใน dec_number)
Sebastian Norr

2

หากคุณต้องการตัวเลข (หลังตัวคั่น) คุณสามารถแยกตัวเลขและนับความยาวส่วนที่สองได้ (หลังจุด)

function countDigits(number) {
    var sp = (number + '').split('.');
    if (sp[1] !== undefined) {
        return sp[1].length;
    } else {
        return 0;
    }
}


1

ฉันยังคงเรียนรู้ Javascript แต่ฉันได้พบกับฟังก์ชันนี้ใน C เมื่อไม่นานมานี้ซึ่งใช้คณิตศาสตร์และ while loop แทนที่จะเป็นสตริงดังนั้นฉันจึงเขียนใหม่สำหรับ Javascript บางทีสิ่งนี้อาจทำได้ซ้ำ ๆ แต่ฉันยังไม่เข้าใจแนวคิดจริงๆ :( นี่เป็นสิ่งที่ดีที่สุดที่ฉันคิดขึ้นมาได้ฉันไม่แน่ใจว่ามันใช้งานได้กับตัวเลขมากแค่ไหนมันใช้ได้ผลเมื่อฉันใส่เป็นร้อย ตัวเลข

function count_digits(n) {
    numDigits = 0;
    integers = Math.abs(n);

    while (integers > 0) {
        integers = (integers - integers % 10) / 10;
        numDigits++;
    }
    return numDigits;
}

แก้ไข: ใช้ได้กับค่าจำนวนเต็มเท่านั้น


1

หมายเหตุ:ฟังก์ชันนี้จะไม่สนใจตัวเลขหลังจุดเฉลี่ยทศนิยมหากคุณต้องการนับด้วยทศนิยมให้ลบเครื่องหมายMath.floor(). ตรงไปที่จุดตรวจสอบสิ่งนี้!

function digitCount ( num )
{
     return Math.floor( num.toString()).length;
}

 digitCount(2343) ;

// ES5 +

 const digitCount2 = num => String( Math.floor( Math.abs(num) ) ).length;

 console.log(digitCount2(3343))

เป็นพื้นสิ่งที่เกิดขึ้นที่นี่ toString()และเช่นเดียวกันในการสร้างฟังก์ชั่นสำหรับการแปลงหลักสตริงเมื่อเราแปลงแล้วเราจะได้พบกับความยาวของสตริงโดยสร้างในฟังก์ชั่นString()length

การแจ้งเตือน:แต่ฟังก์ชั่นนี้จะไม่ทำงานอย่างถูกต้องสำหรับจำนวนลบถ้าคุณกำลังพยายามที่จะเล่นกับจำนวนลบแล้วตรวจสอบคำตอบนี้หรือใส่ง่ายMath.abs()ในบริเวณนั้น

เชียร์คุณ!


1
`You can do it by simple loop using Math.trunc() function. if in interview interviewer ask to do it without converting it into string`
    let num = 555194154234 ;
    let len = 0 ;
    const numLen = (num) => {
     for(let i = 0; i < num ||  num == 1 ; i++){
        num = Math.trunc(num/10);
        len++ ;
     }
      return len + 1 ;
    }
    console.log(numLen(num));

0

ตัวเลขสองหลัก: ฟังก์ชันง่ายๆในกรณีที่คุณต้องการตัวเลขสองหลักขึ้นไปด้วย ECMAScript 6 (ES6):

const zeroDigit = num => num.toString().length === 1 ? `0${num}` : num;

0

คำสั่งปัญหา: นับจำนวน / สตริงที่ไม่ใช้ string.length () jsfunction วิธีแก้ไข: เราสามารถทำได้ผ่าน Forloop เช่น

for (x=0; y>=1 ; y=y/=10){
  x++;
}

if (x <= 10) {
  this.y = this.number;                
}   

else{
  this.number = this.y;
}    

}


0

นี่คือทางออกของฉัน มันทำงานร่วมกับตัวเลขบวกและลบ หวังว่านี่จะช่วยได้

function findDigitAmount(num) {

   var positiveNumber = Math.sign(num) * num;
   var lengthNumber = positiveNumber.toString();

 return lengthNumber.length;
}


(findDigitAmount(-96456431);    // 8
(findDigitAmount(1524):         // 4

0

มันจะง่ายมากที่จะได้ความยาวเป็น

  `${NUM}`.length

โดยที่ NUM คือตัวเลขที่จะได้รับความยาว



0

โปรดใช้นิพจน์ต่อไปนี้เพื่อรับความยาวของตัวเลข

length = variableName.toString().length

0

โซลูชันที่ใช้ได้กับทั้งจำนวนลบและโฟลและไม่เรียกใช้ฟังก์ชันการจัดการสตริงที่มีราคาแพง:

function getDigits(n) {
   var a = Math.abs(n);            // take care of the sign
   var b = a << 0;                 // truncate the number
   if(b - a !== 0) {               // if the number is a float
       return ("" + a).length - 1; // return the amount of digits & account for the dot
   } else {
       return ("" + a).length;     // return the amount of digits
   }
}

-7

คุณสมบัติ length จะส่งกลับความยาวของสตริง (จำนวนอักขระ)

ความยาวของสตริงว่างคือ 0

var str = "Hello World!";
var n = str.length;

ผลลัพธ์ของ n จะเป็น: 12

    var str = "";
    var n = str.length;

ผลลัพธ์ของ n จะเป็น: 0


ความยาวอาร์เรย์คุณสมบัติ:


คุณสมบัติ length จะตั้งค่าหรือส่งกลับจำนวนองค์ประกอบในอาร์เรย์

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.length;

ผลลัพธ์จะเป็น: 4

ไวยากรณ์:

ส่งกลับความยาวของอาร์เรย์:

array.length

กำหนดความยาวของอาร์เรย์:

array.length=number

2
สิ่งนี้ไม่ตอบสนองต่อคำถาม
Steve Taylor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.