ฉันจะตรวจสอบว่าตัวเลขเป็นทศนิยมหรือจำนวนเต็มได้อย่างไร


717

จะหาได้อย่างไรว่าเป็นจำนวนfloatหรือinteger?

1.25 --> float  
1 --> integer  
0 --> integer  
0.25 --> float

47
ฉันเข้าใจสิ่งที่คุณถามที่นี่ แต่เพื่อให้ชัดเจน: <nit-pick>JavaScript ไม่มีประเภทจำนวนเต็มและลอยตัวที่แตกต่างกัน จำนวนใน JavaScript Numberทุกคนเป็นเพียงแค่ </nit-pick>
Matt Ball

4
เป็นInfinityจำนวนเต็มหรือค่าที่ไม่ใช่จำนวนเต็มเท่าที่คุณกำลังกังวล? คำตอบที่นี่มีการกระจายอย่างเท่าเทียมกันในคะแนนนี้
Mike Samuel

11
@MikeSamuel เพื่อความถูกต้องทางคณิตศาสตร์: เนื่องจากอินฟินิตี้ไม่ใช่จำนวนจริงและจำนวนเต็มทั้งหมดเป็นจำนวนจริงInfinityจึงไม่สามารถพิจารณาได้ว่าเป็นจำนวนเต็ม
rvighne

@ rvighne คำถามถามเกี่ยวกับ "ลอย" ไม่ใช่ "ของจริง" ทั้งสองวิธี reals ไม่เกี่ยวข้องเพราะคอมพิวเตอร์สามารถแสดงตัวเลขที่คำนวณได้เท่านั้น
Mike Samuel

2
@vighne ฉันคิดว่าเราเห็นด้วยว่าความจริงที่ว่า infinities และ NaN ไม่ใช่ตัวเลขจริงหมายความว่า IEEE-754 ลอยไม่ใช่ส่วนย่อยของจำนวนจริง การวิเคราะห์เชิงตัวเลขทั้งหมดที่อยู่บนพื้นฐานของ IEEE-754 นั้นต้องจัดการกับข้อเท็จจริงนี้ สิ่งที่ฉันไม่เข้าใจคือวิธีที่คุณคิดว่าความจริงข้อนี้กำหนดว่า is_integral ควรประพฤติตนเป็นคนสำคัญอย่างไร โดยส่วนตัวแล้วฉันคิดว่า ((x% 1) == 0) เป็นพร็อกซีที่ดีและได้รับการระบุโดย IEEE-754 อย่างสมบูรณ์ดังนั้นจึงไม่จำเป็นต้องโต้แย้งเกี่ยวกับการติดต่อระหว่างสายตัวเลขต่าง ๆ
Mike Samuel

คำตอบ:


1255

ตรวจสอบส่วนที่เหลือเมื่อหารด้วย 1:

function isInt(n) {
   return n % 1 === 0;
}

หากคุณไม่ทราบว่าอาร์กิวเมนต์เป็นตัวเลขคุณต้องทำการทดสอบสองครั้ง:

function isInt(n){
    return Number(n) === n && n % 1 === 0;
}

function isFloat(n){
    return Number(n) === n && n % 1 !== 0;
}

อัปเดต 2019 5 ปีหลังจากที่เขียนคำตอบนี้โซลูชันได้มาตรฐานใน ECMA Script 2015 โซลูชันดังกล่าวครอบคลุมอยู่ในคำตอบนี้


138
ระวังนี้ยังจะกลับมาจริงสำหรับสตริงว่างสตริงที่แสดงจำนวนหนึ่ง, true, false, nullอาร์เรย์ที่ว่างเปล่าอาร์เรย์ที่มีจำนวนหนึ่งเดียวที่มีอาร์เรย์สตริงที่แสดงจำนวนหนึ่งและบางทีอาจจะมากกว่า
Dagg Nabbit

17
เคล็ดลับดี แต่ไม่ใช่คำตอบที่ถูกต้องเนื่องจากไม่สามารถตรวจสอบสตริงว่าง""และ1.0 isInt("");&& isInt(1.0);ทั้งคู่ส่งผลให้trueดูตัวอย่างนี้jsbin.com/elohuq/1/edit
แชมป์

9
โดยทั่วไปแล้วการใช้ === นั้นสนับสนุนมากกว่า == โดยทั่วไปเพราะจะนำไปสู่ความปลอดภัยประเภทที่มากกว่าและพฤติกรรมที่คาดการณ์ได้มากกว่าและสม่ำเสมอกว่า ดังที่ผู้ตอบก่อนหน้าระบุไว้คำตอบนี้เป็นจริง 100% ไม่ถูกต้อง ค่า null, สตริงว่าง, 1.0 และอื่น ๆ มากมายจะลงทะเบียนไม่ถูกต้องเป็นจำนวนเต็ม (แม้จะมี === check)
whoblitz

54
คำถามคือวิธีการตรวจสอบว่าตัวเลขเป็นจำนวนเต็มไม่ใช่วิธีตรวจสอบค่าใด ๆ
kennebec

24
ความคิดเห็นที่เป็นศัตรูมากมายเกี่ยวกับวิธีที่มันไม่ตรวจสอบความถูกต้องของสตริง นั่นไม่ใช่ส่วนหนึ่งของคำถามของ OP หากฉันไปยัง SO เพื่อถามคำถามเกี่ยวกับการดึงองค์ประกอบสุดท้ายของอาร์เรย์และมีคนตอบด้วยfunction last (array) { return array[array.length - 1]; }มันเป็น "ผิด" หรือ "คำตอบที่แย่ที่สุดใน SO" เพราะไม่ได้ตรวจสอบว่าอาร์กิวเมนต์เป็นอาร์เรย์ก่อนหรือไม่ ใช่แนวทางปฏิบัติที่ดีในการตรวจสอบข้อโต้แย้ง แต่นั่นเป็นความรับผิดชอบของนักพัฒนาซอฟต์แวร์ ดังนั้นคำตอบควรสั้นและตอบคำถามให้ชัดเจนที่สุดเท่าที่จะทำได้
M Miller

150

ลองใช้ฟังก์ชันเหล่านี้เพื่อทดสอบว่าค่าเป็นค่าดั้งเดิมที่ไม่มีส่วนที่เป็นเศษส่วนหรือไม่และอยู่ภายในขีด จำกัด ขนาดของสิ่งที่สามารถแสดงเป็นจำนวนเต็มได้

function isFloat(n) {
    return n === +n && n !== (n|0);
}

function isInteger(n) {
    return n === +n && n === (n|0);
}

5
heh awesom exploit มันเป็นของฉันค่อนข้างมาก ( n===+nเพื่อตรวจสอบตัวเลข, n|0ปัดเศษ) แต่มีตัวดำเนินการในตัว funky
Claudiu

7
@John Hartsock สตริงจะไม่เป็นค่าตัวเลข มันเป็นสตริง จุดของฟังก์ชั่นนี้คือการทดสอบว่าค่าเป็นค่าตัวเลข Javascript ที่ไม่มีส่วนที่เป็นเศษส่วนหรือไม่และอยู่ภายในขีด จำกัด ขนาดของสิ่งที่สามารถแสดงเป็นจำนวนเต็มได้ หากคุณต้องการตรวจสอบสตริงเพื่อดูว่ามีลำดับอักขระที่แสดงถึงตัวเลขหรือไม่คุณต้องโทรparseFloat()ก่อน
แหลม

4
@John Hartsock: มันจะไม่กลับมาเป็นจริงเว้นแต่จะมีการส่งหมายเลขดั้งเดิม ฉันคิดว่าเหมาะสมแล้วที่ให้ชื่อของฟังก์ชั่น สิ่งอื่นใดที่ควรเป็นตัวเลือกสำหรับ isString, isBoolean เป็นต้นหากฟังก์ชันดังกล่าวกำลังถูกเขียน
Dagg Nabbit

4
@Pointy: ความแม่นยำสองเท่าของลอยสามารถแสดงค่าจำนวนเต็มได้ถึง 2 ^ 53 ดังนั้นมันขึ้นอยู่กับว่า OP ถามเกี่ยวกับจำนวนเต็มในคณิตศาสตร์ (ตัวเลขทั้งหมด) หรือในข้อมูล 32- บิต หากเป็นแบบหลังทางออกของคุณสมบูรณ์แบบ
djd

8
ในจาวาสคริปต์ตัวดำเนินการระดับบิตเช่น|(OR) จะทำงานกับจำนวนเต็มแบบ 32 บิตที่ลงชื่อแล้วเท่านั้น OP ไม่ได้ระบุว่าเป้าหมายคือการตรวจสอบค่า int32 ที่ลงนามแล้ว ดังนั้นสิ่งนี้จะไม่สามารถใช้ได้กับหมายเลขที่อยู่นอกช่วง isInteger(5000000000)จะกลับมาfalseซึ่งเป็นสิ่งที่ผิด!
Onur Yıldırım

93

ทำไมไม่เป็นเช่นนี้:

var isInt = function(n) { return parseInt(n) === n };

นี่คือแก่นแท้ของทางออกที่ดีสำหรับฉัน ฉันต้องอนุญาตจำนวนเต็มบวกและไม่อนุญาตให้ลอยสตริงและจำนวนเต็มลบ
Imran-UK

4
ดูเหมือนว่าวิธีการแก้ปัญหาที่ดีกว่าคนอื่น ๆ ในหัวข้อนี้ ชุมชนสามารถเสนอคำวิจารณ์ได้ไหม?
sbichenko

5
var y = 1.00; y === แยกวิเคราะห์ (y, 10); // นี่กลับมาจริงสำหรับฉันซึ่งไม่ใช่สิ่งที่เราต้องการจริงๆ
whoughton

เท่านั้น "ข้อเสีย" ผมเห็นว่าเป็นตัวเลขที่กำหนดจะถูกแปลงเป็นสตริงโดยn parseIntดูMDN แต่ฉันจะใช้วิธีนี้ :)
RhinoDevel

2
@ekussberg: ทำไมจึงควรกลับเท็จ? 1 คือ int และ 02 อาร์กิวเมนต์ที่สองจะถูกละเว้น
Flimzy

88

มีวิธีการที่เรียกว่าNumber.isInteger()ซึ่งปัจจุบันมีการใช้งานในทุกสิ่งยกเว้น IE MDNยังให้บริการ polyfill สำหรับเบราว์เซอร์อื่น ๆ :

Number.isInteger = Number.isInteger || function(value) {
  return typeof value === 'number' && 
    isFinite(value) && 
    Math.floor(value) === value;
};

อย่างไรก็ตามสำหรับกรณีการใช้งานส่วนใหญ่คุณจะดีกว่าการใช้Number.isSafeInteger ซึ่งจะตรวจสอบว่าค่าสูง / ต่ำจนตำแหน่งทศนิยมจะหายไปหรือไม่ MDNมี polyfil สำหรับสิ่งนี้เช่นกัน (คุณต้องมีisIntegerpollyfill ด้านบนด้วย)

if (!Number.MAX_SAFE_INTEGER) {
    Number.MAX_SAFE_INTEGER = 9007199254740991; // Math.pow(2, 53) - 1;
}
Number.isSafeInteger = Number.isSafeInteger || function (value) {
   return Number.isInteger(value) && Math.abs(value) <= Number.MAX_SAFE_INTEGER;
};

ตอนนี้ใช้งานได้ใน Chrome ของฉันด้วยและอาจเป็นไปได้ในอนาคต
Dukeatcoding

1
ในความคิดของฉันทางออกที่ดีที่สุด
Automatico

1
โพลีฟิลนี้เป็นทางออกที่น่าเชื่อถือและง่ายที่สุด
Francesco Pasa

2
12.0 ∈ ℤ@SergeyPanfilov
КонстантинВан

1
ฉันไม่รู้ถ้าข้อมูลจำเพาะมีการเปลี่ยนแปลงตั้งแต่คำตอบนี้ถูกจัดให้ แต่ทราบว่าฟังก์ชั่นดังกล่าวข้างต้นไม่ได้เป็น polyfill Number.isIntegerที่ถูกต้องสำหรับ มันเป็นอย่างไร polyfill Number.isSafeIntegerที่ถูกต้องสำหรับ Number.isIntegerไม่ควรตรวจสอบว่าหมายเลขเป็น "จำนวนเต็มปลอดภัย" หรือไม่ เห็นใน MDN: isIntegerและisSafeInteger
nunocastromartins

33

คุณสามารถใช้นิพจน์ทั่วไปอย่างง่าย:

function isInt(value) {

    var er = /^-?[0-9]+$/;

    return er.test(value);
}

หรือคุณสามารถใช้ฟังก์ชั่นด้านล่างได้เช่นกันตามความต้องการของคุณ พวกเขาจะได้รับการพัฒนาโดยโครงการ PHPJS

is_int() => ตรวจสอบว่าประเภทตัวแปรเป็นจำนวนเต็มหรือไม่และเนื้อหานั้นเป็นจำนวนเต็มหรือไม่

is_float() => ตรวจสอบว่าประเภทตัวแปรลอยหรือไม่และเนื้อหาเป็นประเภทลอยหรือไม่

ctype_digit() => ตรวจสอบว่าประเภทตัวแปรเป็นสตริงหรือไม่และมีเนื้อหาเป็นเลขทศนิยมหรือไม่

อัปเดต 1

ตอนนี้ก็ตรวจสอบตัวเลขที่เป็นลบเช่นกันขอบคุณสำหรับความคิดเห็น @ChrisBartley !


1
สมบูรณ์แบบสำหรับทดสอบจำนวนเต็มแบบไม่มีเครื่องหมาย
tothemario

7
หนึ่งซับ:/^[0-9]+$/.test(String(value))
tothemario

สั้นและซับในที่สั้นกว่าที่อ่านได้เล็กน้อย:/^[0-9]+$/.test(''+value)
skeggse

3
ไม่จัดการจำนวนเต็มลบ คุณไม่ต้องการผู้ประกอบการที่ประกอบไปด้วยเนื่องจากการทดสอบ () ส่งคืนบูลีน นี้ควรจะทำมัน:return /^-?\d+$/.test(String(value));
คริส Bartley

@ChrisBartley ขอบคุณ! ฉันทำการอัปเดตรวมถึงเครดิตของคุณ โปรดตรวจสอบว่าทุกอย่างเรียบร้อยดีไหม
Marcio Mazzucato

19

นี่คือฟังก์ชันที่มีประสิทธิภาพที่ตรวจสอบว่าค่าเป็นตัวเลขหรือสามารถแปลงเป็นตัวเลขได้อย่างปลอดภัย :

function isNumber(value) {
    if ((undefined === value) || (null === value)) {
        return false;
    }
    if (typeof value == 'number') {
        return true;
    }
    return !isNaN(value - 0);
}

และสำหรับจำนวนเต็ม (จะคืนค่าเท็จหากค่าเป็นทศนิยม):

function isInteger(value) {
    if ((undefined === value) || (null === value)) {
        return false;
    }
    return value % 1 == 0;
}

ประสิทธิภาพที่นี่คือ parseInt (หรือ parseNumber) จะหลีกเลี่ยงเมื่อค่าเป็นตัวเลขอยู่แล้ว ฟังก์ชันการแยกวิเคราะห์ทั้งสองจะแปลงเป็นสตริงก่อนเสมอและพยายามแยกสตริงนั้นซึ่งจะเป็นการสิ้นเปลืองหากค่านั้นเป็นตัวเลขอยู่แล้ว

ขอบคุณที่โพสต์อื่น ๆ ที่นี่เพื่อให้ความคิดเพิ่มเติมสำหรับการเพิ่มประสิทธิภาพ!


3
ฟังก์ชันนี้ล้มเหลวในสตริงว่าง: isNumber ('') เป็นจริง
Jason Grout

14
function isInteger(x) { return typeof x === "number" && isFinite(x) && Math.floor(x) === x; }
function isFloat(x) { return !!(x % 1); }

// give it a spin

isInteger(1.0);        // true
isFloat(1.0);          // false
isFloat(1.2);          // true
isInteger(1.2);        // false
isFloat(1);            // false
isInteger(1);          // true    
isFloat(2e+2);         // false
isInteger(2e+2);       // true
isFloat('1');          // false
isInteger('1');        // false
isFloat(NaN);          // false
isInteger(NaN);        // false
isFloat(null);         // false
isInteger(null);       // false
isFloat(undefined);    // false
isInteger(undefined);  // false

4
เห็นได้ชัดว่าลอยที่ลงท้ายด้วย. 0 จะถูกส่งไปยัง Int ใน JavaScript โดยอัตโนมัติ

1.2ล้มเหลวด้วย ทดสอบฟังก์ชันตัวเลขเสมอด้วย 0.1 0.2 0.3
Lukas Liesis

@ LukasLies ไม่ได้สำหรับฉัน
doubleOrt

ไม่จำเป็นต้องมีผู้ประกอบการที่เท่าเทียมกันอย่างเข้มงวดที่นี่
doubleOrt

isFloat (1563457121531) กลับเท็จ
Aalex Gabi

9
function isInt(n) 
{
    return n != "" && !isNaN(n) && Math.round(n) == n;
}
function isFloat(n){
    return n != "" && !isNaN(n) && Math.round(n) != n;
}

ใช้ได้กับทุกกรณี


2
+1 สิ่งนี้ดี isInt('1')ส่งคืนtrueตามที่คาดไว้ (อย่างน้อยสำหรับฉัน) ถึงแม้ว่าจะแปลก แต่ก็กลับtrueไปisInt([5])เช่นกัน ไม่สำคัญสำหรับฉัน แต่ขอให้คุณดูแล
acdcjunior

2
isFloat (12.0) เป็นเท็จ
django

6

ตามที่คนอื่นพูดถึงคุณมีเพียงสองเท่าใน JS ดังนั้นคุณจะกำหนดจำนวนเป็นจำนวนเต็มได้อย่างไร เพียงตรวจสอบว่าหมายเลขที่ปัดเศษมีค่าเท่ากับตัวเองหรือไม่:

function isInteger(f) {
    return typeof(f)==="number" && Math.round(f) == f;
}
function isFloat(f) { return typeof(f)==="number" && !isInteger(f); }

3
อาจต้องการตรวจสอบว่าค่าเป็นตัวเลข ... isFloat('abc')ส่งคืนtrue
Dagg Nabbit

isFloat(NaN) // true
shime

@shime: จับได้ดี NaN เป็นเทคนิคที่เป็นเลขทศนิยมแม้ว่า ... ขึ้นอยู่กับกรณีการใช้งานที่ฉันคิด
Claudiu


5

นี่คือสิ่งที่ฉันใช้สำหรับจำนวนเต็ม:

Math.ceil(parseFloat(val)) === val

สั้นดี :) ใช้งานได้ตลอดเวลา นี่คือสิ่งที่ David Flanagan แนะนำถ้าฉันไม่ผิด


ฉันชอบอันนี้เพราะมันเป็นคำตอบสั้น ๆ ง่ายๆที่ไม่ต้องพึ่งพาการทำงานระดับบิตลับ
Jim

ทำไมparseFloat?
doubleOrt

4

มันขึ้นอยู่กับสิ่งที่คุณต้องการบรรลุ หากคุณต้องการ "เลียนแบบ" ภาษาที่พิมพ์อย่างยิ่งแล้วฉันขอแนะนำให้คุณไม่ลอง ตามที่คนอื่น ๆ กล่าวถึงตัวเลขทั้งหมดมีการแสดงเหมือนกัน (ประเภทเดียวกัน)

ใช้บางอย่างเช่นClaudiu ที่จัดเตรียมไว้:

isInteger( 1.0 ) -> จริง

ซึ่งดูดีสำหรับสามัญสำนึก แต่ในบางสิ่งบางอย่างเช่น C คุณจะได้รับ false


4

หมายเลขโฟลตใด ๆ ที่มีส่วนทศนิยมเป็นศูนย์ (เช่น 1.0, 12.00, 0.0) จะถูกส่งไปยัง Integer โดยปริยายดังนั้นจึงไม่สามารถตรวจสอบได้ว่าเป็นโฟลตหรือไม่



3

มันไม่จำเป็นต้องซับซ้อนมากนัก ค่าตัวเลขของ parseFloat () และ parseInt () ที่เทียบเท่าของจำนวนเต็มจะเท่ากัน ดังนั้นคุณสามารถทำเช่นนั้น:

function isInt(value){ 
    return (parseFloat(value) == parseInt(value)) && !isNaN(value);
}

แล้วก็

if (isInt(x)) // do work

วิธีนี้จะอนุญาตให้มีการตรวจสอบสตริงและทำให้ไม่เข้มงวด หากต้องการโซลูชันประเภทที่รัดกุม (aka จะไม่ทำงานกับสตริง):

function is_int(value){ return !isNaN(parseInt(value * 1) }

isInteger (12.0) เป็นจริง
django

3
var isInt = function (n) { return n === (n | 0); };

ยังไม่มีกรณีที่สิ่งนี้ไม่ได้ทำงาน


เฮ้ขอโทษทำไมมันกลับเท็จ? console.log (isInt (7932938942839482938));
itsme

4
เพราะมันเกิน MaxInt
ankr

แต่คุณสามารถตั้งค่าความยาวไม่เกิน Int สูงสุดได้หรือไม่ เกิดอะไรขึ้นถ้าฉันไม่ได้เป็นความยาว int จะถูกส่งคืน?
itsme

1
@ekussberg ใช่เพราะ2เป็นจำนวนเต็มและ23ถือเป็นอาร์กิวเมนต์ที่สองของฟังก์ชัน ในทศนิยมจาวาสคริปต์ถูกเขียนโดยใช้จุดเป็นตัวคั่น - 2.23ดังนั้นมันควรจะเป็น
ankr

1
หรือเป็นโอกาสที่ดีในการเรียนรู้เกี่ยวกับการทำงานระดับบิต คุณจะได้รับประโยชน์มากมายจากการก้าวไปข้างหน้า
ตอบ

2

นี่คือรหัสสุดท้ายสำหรับการตรวจสอบทั้ง INT และการลอยตัว

function isInt(n) { 
   if(typeof n == 'number' && Math.Round(n) % 1 == 0) {
       return true;
   } else {
       return false;
   }
} 

หรือ

function isInt(n) {   
   return typeof n == 'number' && Math.Round(n) % 1 == 0;   
}   

การทดสอบนี้เป็นการลอยถ้า n เกิดขึ้นเป็นจำนวนมากเท่านั้น
hacklikecrack

2
function isInteger(n) {
   return ((typeof n==='number')&&(n%1===0));
}

function isFloat(n) {
   return ((typeof n==='number')&&(n%1!==0));
}

function isNumber(n) {
   return (typeof n==='number');
}

จำนวนเต็มไม่ใช่ทุ่นหรือ ข่าวให้ฉัน
Maarten Bodewes

2

ง่ายเหมือน:

if( n === parseInt(n) ) ...

ลองในคอนโซล:

x=1;
x===parseInt(x); // true
x="1";
x===parseInt(x); // false
x=1.1;
x===parseInt(x); // false, obviously

// BUT!

x=1.0;
x===parseInt(x); // true, because 1.0 is NOT a float!

สิ่งนี้ทำให้ผู้คนสับสนมาก เมื่อใดก็ตามที่บางสิ่งบางอย่างเป็น. 0 มันจะไม่ลอยอีกต่อไป มันเป็นจำนวนเต็ม หรือคุณอาจเรียกมันว่า "สิ่งที่เป็นตัวเลข" เพราะไม่มีความแตกต่างที่เข้มงวดเหมือนย้อนกลับไปในยุคค.

โดยพื้นฐานแล้วสิ่งที่คุณทำได้คือตรวจสอบจำนวนเต็มที่ยอมรับความจริงที่ว่า 1,000 เป็นจำนวนเต็ม

ข้อความด้านที่น่าสนใจ

มีความคิดเห็นเกี่ยวกับคนจำนวนมาก จำนวนมากหมายถึงไม่มีปัญหาสำหรับวิธีการนี้ เมื่อใดก็ตามที่การแยกวิเคราะห์ไม่สามารถจัดการกับตัวเลข (เพราะมันใหญ่เกินไป) มันจะคืนค่าอย่างอื่นมากกว่าค่าจริงดังนั้นการทดสอบจะคืนค่า FALSE นี่เป็นสิ่งที่ดีเพราะถ้าคุณพิจารณาบางสิ่งบางอย่าง "จำนวน" คุณคาดหวังว่า JS จะสามารถคำนวณได้ - ดังนั้นใช่ตัวเลขมี จำกัด และการแยกวิเคราะห์จะนำสิ่งนี้มาพิจารณาด้วยวิธีนี้

ลองสิ่งนี้:

<script>

var a = 99999999999999999999;
var b = 999999999999999999999; // just one more 9 will kill the show!
var aIsInteger = (a===parseInt(a))?"a is ok":"a fails";
var bIsInteger = (b===parseInt(b))?"b is ok":"b fails";
alert(aIsInteger+"; "+bIsInteger);

</script>

ในเบราว์เซอร์ของฉัน (IE8) สิ่งนี้จะส่งกลับ "a is ok; b failed" ซึ่งเป็นสิ่งที่เกิดขึ้นเพราะมีจำนวนมากใน b ขีด จำกัด อาจแตกต่างกัน แต่ฉันเดา 20 หลัก "ควรจะเพียงพอสำหรับทุกคน" เพื่อพูดคลาสสิก :)


นี่เป็นเรื่องที่ดีถ้าคุณต้องการตรวจสอบจำนวนเต็ม (จากคณิตศาสตร์ POV) แต่ถ้าคุณต้องการตรวจสอบให้แน่ใจว่าพวกเขาทำงานเหมือนจำนวนเต็ม (จากการคำนวณ POV) มันจะไม่ถูกต้องสำหรับจำนวนมาก ดูความคิดเห็นนี้
Dagg Nabbit

อืมมมมม ... ทำไมคุณถึงคิดอย่างนั้น? ฉันหมายความว่าถ้า parseInt ส่งคืนบางสิ่งและดูเหมือนว่าเท่ากับตัวแปรเองคุณสามารถมั่นใจได้ว่า n ของคุณทำงานเป็นจำนวนเต็มอย่างแท้จริง ฉันพบว่า 9999999999999999999999 (นั่นคือ 20 ครั้ง "9") เป็นตัวเลขในขณะที่เพิ่มอีก "9" ทำให้ parseInt ล้มเหลว (ส่งคืน 1) อาจขึ้นอยู่กับเบราว์เซอร์ อย่างไรก็ตามใช่มีข้อ จำกัด และไม่สิ่งใดก็ตามที่อยู่นอกขีด จำกัด นั้นจะไม่ส่งคืนจริงสำหรับการตรวจสอบข้างต้น
dkellner

สิ่งที่ฉันหมายถึงคือตัวดำเนินการบิต (ซึ่งถือว่าตัวเลขเป็น 32 บิต int) จะไม่ให้ผลลัพธ์ที่คาดหวังกับตัวเลขซึ่งไม่สามารถแสดงเป็น 32 บิต int ดังนั้นตัวเลขเหล่านั้นไม่ควรถูกระบุว่าเป็น ints สิ่งนี้สอดคล้องกับการNumber.isIntegerทำงานของข้อเสนอ
Dagg Nabbit

บางสิ่งสามารถเป็นจำนวนเต็มจริงได้โดยไม่ต้องจัดเก็บวิธีเดียว ฉันเห็นจุดของคุณ แต่จำนวนเต็มเป็นจำนวนเต็มเพราะพวกเขาไม่มีส่วนที่เป็นเศษส่วนและสามารถเพิ่ม / ลบได้โดยไม่ต้องมีผลลัพธ์แบบลอย หากคุณปฏิบัติกับตัวเลขเป็นบิตฟิลด์คุณคิดว่าบางอย่างเกี่ยวกับวิธีการจัดเก็บซึ่งเป็น - ในความคิดของฉัน - วิธีการทำงานจริง แต่ไม่ใช่วิธีที่เชื่อถือได้ 100% หากคุณกำลังมองหา "จำนวนเต็มเก็บไว้ในวิธีที่แน่นอน" ฉันไม่แน่ใจว่ามีการทดสอบบรรทัดเดียวที่คุณสามารถใช้ได้อย่างปลอดภัยบนแพลตฟอร์มทั้งหมด
dkellner

ตัวเลขที่สามารถแสดงเป็น int 32- บิตทำงานได้อย่างน่าเชื่อถือ 100% กับผู้ประกอบการระดับบิต คุณไม่ได้ "คิดอะไรเกี่ยวกับวิธีจัดเก็บ;" ตัวเลขจะถูกแปลงเป็นจำนวนเต็มเสริมสองของ 32 บิตแบบบิ๊กเอนเดเนี่ยนต่อสเปค ตัวเลขที่ไม่สามารถแสดงในรูปแบบนี้ไม่ควรนำมาพิจารณาเป็นจำนวนเต็ม อีกครั้งนี้สอดคล้องกับวิธีการNumber.isIntegerทำงาน การทดสอบบรรทัดn === (n | 0)เดียวดังที่แสดงในคำตอบอื่น
Dagg Nabbit

2

วิธีนี้ใช้ได้ผลสำหรับฉัน

<html>
<body>
  <form method="post" action="#">
    <input type="text" id="number_id"/>
    <input type="submit" value="send"/>
  </form>
  <p id="message"></p>
  <script>
    var flt=document.getElementById("number_id").value;
    if(isNaN(flt)==false && Number.isInteger(flt)==false)
    {
     document.getElementById("message").innerHTML="the number_id is a float ";
    }
   else 
   {
     document.getElementById("message").innerHTML="the number_id is a Integer";
   }
  </script>
</body>
</html>

1

สำหรับจำนวนเต็มฉันใช้อันนี้

function integer_or_null(value) {
    if ((undefined === value) || (null === value)) {
        return null;
    }
    if(value % 1 != 0) {
        return null;
    }
    return value;
}

1

ในจาวาสคริปต์หมายเลขทั้งหมดนั้นinternally 64 bit floating pointเหมือนกับ double ใน java ไม่มีประเภทที่แตกต่างกันใน JavaScript numberมีทั้งหมดจะเป็นตัวแทนโดยแบ่งตามชนิด ดังนั้นคุณจะไม่สามารถinstanceofตรวจสอบได้ อย่างไรก็ตามคุณสามารถใช้วิธีแก้ไขปัญหาข้างต้นที่ให้มาเพื่อดูว่าเป็นเศษส่วนหรือไม่ นักออกแบบของจาวาสคริปต์รู้สึกกับประเภทเดียวที่พวกเขาสามารถหลีกเลี่ยงข้อผิดพลาดที่หล่อประเภท


1

บางครั้งจำนวนวัตถุไม่อนุญาตให้คุณใช้ตัวดำเนินการ mod (%) โดยตรงหากคุณเผชิญกับกรณีนั้นคุณสามารถใช้วิธีนี้

if(object instanceof Number ){
   if( ((Number) object).doubleValue() % 1 == 0 ){
      //your object is an integer
   }
   else{
      //your object is a double
   }
}

1

ลองคำตอบที่นี่ฉันลงเอยด้วยการเขียนโซลูชันนี้ ใช้ได้กับตัวเลขภายในสตริงด้วย

function isInt(number) {
    if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false;
    return !(number - parseInt(number));
}

function isFloat(number) {
    if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false;
    return number - parseInt(number) ? true : false;
}

    var tests = {
        'integer' : 1,
        'float' : 1.1,
        'integerInString' : '5',
        'floatInString' : '5.5',
        'negativeInt' : -345,
        'negativeFloat' : -34.98,
        'negativeIntString' : '-45',
        'negativeFloatString' : '-23.09',
        'notValidFalse' : false,
        'notValidTrue' : true,
        'notValidString' : '45lorem',
        'notValidStringFloat' : '4.5lorem',
        'notValidNan' : NaN,
        'notValidObj' : {},
        'notValidArr' : [1,2],
    };

    function isInt(number) {
        if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false;
        return !(number - parseInt(number));
    }
    
    function isFloat(number) {
        if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false;
        return number - parseInt(number) ? true : false;
    }

    function testFunctions(obj) {
        var keys = Object.keys(obj);
        var values = Object.values(obj);

        values.forEach(function(element, index){
            console.log(`Is ${keys[index]} (${element}) var an integer? ${isInt(element)}`);
            console.log(`Is ${keys[index]} (${element}) var a float? ${isFloat(element)}`);
        });
    }

    testFunctions(tests);


0

นี่อาจจะไม่ใช่ตัวแสดงคำตอบ% ซึ่งทำให้คุณไม่ต้องแปลงเป็นสตริงก่อน แต่ฉันยังไม่เคยเห็นใครโพสต์เลยดังนั้นนี่เป็นอีกตัวเลือกหนึ่งที่น่าจะใช้ได้ดี:

function isInteger(num) {
    return num.toString().indexOf('.') === -1;
}

วิธีการที่ดี IMHO
Sergei Panfilov

ฉันจะเพิ่มว่าวิธี ES6 รวมถึง () ทำให้คำตอบนี้ง่ายยิ่งขึ้น
เพลา

0

สำหรับผู้ที่สงสัยการใช้ Benchmark.js ฉันทดสอบคำตอบที่ได้รับการโหวตมากที่สุด (และโพสต์ที่โพสต์วันนี้) ในโพสต์นี้นี่คือผลลัพธ์ของฉัน:

var n = -10.4375892034758293405790;
var suite = new Benchmark.Suite;
suite
    // kennebec
    .add('0', function() {
        return n % 1 == 0;
    })
    // kennebec
    .add('1', function() {
        return typeof n === 'number' && n % 1 == 0;
    })
    // kennebec
    .add('2', function() {
        return typeof n === 'number' && parseFloat(n) == parseInt(n, 10) && !isNaN(n);
    })

    // Axle
    .add('3', function() {
        return n.toString().indexOf('.') === -1;
    })

    // Dagg Nabbit
    .add('4', function() {
        return n === +n && n === (n|0);
    })

    // warfares
    .add('5', function() {
        return parseInt(n) === n;
    })

    // Marcio Simao
    .add('6', function() {
        return /^-?[0-9]+$/.test(n.toString());
    })

    // Tal Liron
    .add('7', function() {
        if ((undefined === n) || (null === n)) {
            return false;
        }
        if (typeof n == 'number') {
            return true;
        }
        return !isNaN(n - 0);
    });

// Define logs and Run
suite.on('cycle', function(event) {
    console.log(String(event.target));
}).on('complete', function() {
    console.log('Fastest is ' + this.filter('fastest').pluck('name'));
}).run({ 'async': true });

0 x 12,832,357 ops/sec ±0.65% (90 runs sampled)
1 x 12,916,439 ops/sec ±0.62% (95 runs sampled)
2 x 2,776,583 ops/sec ±0.93% (92 runs sampled)
3 x 10,345,379 ops/sec ±0.49% (97 runs sampled)
4 x 53,766,106 ops/sec ±0.66% (93 runs sampled)
5 x 26,514,109 ops/sec ±2.72% (93 runs sampled)
6 x 10,146,270 ops/sec ±2.54% (90 runs sampled)
7 x 60,353,419 ops/sec ±0.35% (97 runs sampled)

Fastest is 7 Tal Liron

0

นี่คือรหัสของฉัน มันตรวจสอบเพื่อให้แน่ใจว่ามันไม่ใช่สตริงว่างเปล่า (ซึ่งจะผ่าน) และจากนั้นแปลงเป็นรูปแบบตัวเลข ตอนนี้ขึ้นอยู่กับว่าคุณต้องการให้ '1.1' เท่ากับ 1.1 นี่อาจเป็นสิ่งที่คุณกำลังมองหาหรือไม่

var isFloat = function(n) {
    n = n.length > 0 ? Number(n) : false;
    return (n === parseFloat(n));
};
var isInteger = function(n) {
    n = n.length > 0 ? Number(n) : false;
    return (n === parseInt(n));
};

var isNumeric = function(n){

   if(isInteger(n) || isFloat(n)){
        return true;
   }
   return false;

};

0

ฉันชอบฟังก์ชันเล็ก ๆ นี้ซึ่งจะคืนค่าจริงสำหรับทั้งจำนวนเต็มบวกและลบ:

function isInt(val) {
    return ["string","number"].indexOf(typeof(val)) > -1 && val !== '' && !isNaN(val+".0");
}

สิ่งนี้ใช้งานได้เนื่องจาก 1 หรือ "1" กลายเป็น "1.0" ซึ่ง isNaN () ส่งคืน false บน (ซึ่งเราจะคัดค้านและส่งคืน) แต่ 1.0 หรือ "1.0" กลายเป็น "1.0.0" ในขณะที่ "string" กลายเป็น "สตริง 0 "ซึ่งไม่ใช่ตัวเลขดังนั้น isNaN () จะส่งกลับค่า false (และอีกครั้งจะถูกทำให้ไร้ผล)

หากคุณต้องการจำนวนเต็มบวกเท่านั้นมีตัวแปรนี้:

function isPositiveInt(val) {
    return ["string","number"].indexOf(typeof(val)) > -1 && val !== '' && !isNaN("0"+val);
}

หรือสำหรับจำนวนเต็มลบ:

function isNegativeInt(val) {
    return `["string","number"].indexOf(typeof(val)) > -1` && val !== '' && isNaN("0"+val);
}

isPositiveInt () ทำงานโดยการย้ายสตริงตัวเลขที่ต่อกันไว้ข้างหน้าของค่าที่จะทดสอบ ตัวอย่างเช่น isPositiveInt (1) ให้ผลลัพธ์เป็น isNaN () ประเมิน "01" ซึ่งประเมินค่าเท็จ ในขณะเดียวกัน isPositiveInt (-1) ให้ผลลัพธ์เป็น isNaN () ประเมิน "0-1" ซึ่งประเมินค่าจริง เราปฏิเสธค่าส่งคืนและให้สิ่งที่เราต้องการ isNegativeInt () ทำงานในทำนองเดียวกัน แต่ไม่ส่งคืนค่า isNaN ()

แก้ไข:

การใช้งานดั้งเดิมของฉันก็จะกลับมาจริงในอาร์เรย์และสตริงที่ว่างเปล่า การใช้งานนี้ไม่มีข้อบกพร่องนั้น นอกจากนี้ยังมีประโยชน์ในการคืนค่าก่อนถ้า val ไม่ใช่สตริงหรือหมายเลขหรือถ้าเป็นสตริงว่างทำให้เร็วขึ้นในกรณีเหล่านี้ คุณสามารถแก้ไขเพิ่มเติมได้โดยแทนที่สองประโยคแรกด้วย

typeof(val) != "number"

ถ้าคุณต้องการจับคู่ตัวเลขที่แท้จริง (และไม่ใช่สตริง)

แก้ไข:

ฉันยังไม่สามารถโพสต์ความคิดเห็นได้ดังนั้นฉันจึงเพิ่มคำตอบของฉัน มาตรฐานที่โพสต์โดย @ อโศกนั้นมีข้อมูลมาก อย่างไรก็ตามฟังก์ชั่นที่เร็วที่สุดนั้นไม่ตรงกับความต้องการเนื่องจากมันจะส่งกลับค่า TRUE สำหรับการลอย, อาร์เรย์, บูลีนและสตริงว่าง

ฉันสร้างชุดทดสอบต่อไปนี้เพื่อทดสอบแต่ละฟังก์ชันเพิ่มคำตอบของฉันลงในรายการด้วย (ฟังก์ชัน 8 ซึ่งแยกสตริงและฟังก์ชัน 9 ซึ่งไม่ได้):

funcs = [
    function(n) {
        return n % 1 == 0;
    },
    function(n) {
        return typeof n === 'number' && n % 1 == 0;
    },
    function(n) {
        return typeof n === 'number' && parseFloat(n) == parseInt(n, 10) && !isNaN(n);
    },
    function(n) {
        return n.toString().indexOf('.') === -1;
    },
    function(n) {
        return n === +n && n === (n|0);
    },
    function(n) {
        return parseInt(n) === n;
    },
    function(n) {
        return /^-?[0-9]+$/.test(n.toString());
    },
    function(n) {
        if ((undefined === n) || (null === n)) {
            return false;
        }
        if (typeof n == 'number') {
            return true;
        }
        return !isNaN(n - 0);
    },
    function(n) {
        return ["string","number"].indexOf(typeof(n)) > -1 && n !== '' && !isNaN(n+".0");
    }
];
vals = [
    [1,true],
    [-1,true],
    [1.1,false],
    [-1.1,false],
    [[],false],
    [{},false],
    [true,false],
    [false,false],
    [null,false],
    ["",false],
    ["a",false],
    ["1",null],
    ["-1",null],
    ["1.1",null],
    ["-1.1",null]
];

for (var i in funcs) {
    var pass = true;
    console.log("Testing function "+i);
    for (var ii in vals) {
        var n = vals[ii][0];
        var ns;
        if (n === null) {
            ns = n+"";
        } else {
            switch (typeof(n)) {
                case "string":
                    ns = "'" + n + "'";
                    break;
                case "object":
                    ns = Object.prototype.toString.call(n);
                    break;
                default:
                    ns = n;
            }
            ns = "("+typeof(n)+") "+ns;
        }

        var x = vals[ii][1];
        var xs;
        if (x === null) {
            xs = "(ANY)";
        } else {
            switch (typeof(x)) {
                case "string":
                    xs = "'" + n + "'";
                    break;
                case "object":
                    xs = Object.prototype.toString.call(x);
                    break;
                default:
                    xs = x;
            }
            xs = "("+typeof(x)+") "+xs;
        }

        var rms;
        try {
            var r = funcs[i](n);
            var rs;
            if (r === null) {
                rs = r+"";
            } else {
                switch (typeof(r)) {
                    case "string":
                        rs = "'" + r + "'";
                        break;
                    case "object":
                        rs = Object.prototype.toString.call(r);
                        break;
                    default:
                        rs = r;
                }
                rs = "("+typeof(r)+") "+rs;
            }

            var m;
            var ms;
            if (x === null) {
                m = true;
                ms = "N/A";
            } else if (typeof(x) == 'object') {
                m = (xs === rs);
                ms = m;
            } else {
                m = (x === r);
                ms = m;
            }
            if (!m) {
                pass = false;
            }
            rms = "Result: "+rs+", Match: "+ms;
        } catch (e) {
            rms = "Test skipped; function threw exception!"
        }

        console.log("    Value: "+ns+", Expect: "+xs+", "+rms);
    }
    console.log(pass ? "PASS!" : "FAIL!");
}

ฉันยังเรียกใช้เบนช์มาร์กด้วยฟังก์ชัน # 8 อีกครั้งในรายการ ฉันจะไม่โพสต์ผลเนื่องจากพวกเขาน่าอายเล็กน้อย (เช่นฟังก์ชั่นนั้นไม่เร็ว) ...

The (ย่อ - ฉันลบการทดสอบที่สำเร็จเนื่องจากผลลัพธ์ค่อนข้างยาว) ผลลัพธ์มีดังนี้:

Testing function 0
Value: (object) [object Array], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) true, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) false, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: null, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '', Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
FAIL!

Testing function 1
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

Testing function 2
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

Testing function 3
Value: (object) true, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (object) false, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) [object Array], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) [object Object], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: null, Expect: (boolean) false, Test skipped; function threw exception!
Value: (string) '', Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) 'a', Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
FAIL!

Testing function 4
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

Testing function 5
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

Testing function 6
Value: null, Expect: (boolean) false, Test skipped; function threw exception!
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

Testing function 7
Value: (number) 1.1, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (number) -1.1, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (object) true, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) [object Array], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) [object Object], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '', Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) true, Match: N/A
FAIL!

Testing function 8
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

Testing function 9
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

ฉันทิ้งไว้ในความล้มเหลวเพื่อให้คุณสามารถดูว่าแต่ละฟังก์ชั่นล้มเหลวและการทดสอบ (สตริง) '#' เพื่อให้คุณสามารถดูว่าแต่ละฟังก์ชั่นการจัดการจำนวนเต็มและค่าลอยในสตริงเพราะบางคนอาจต้องการแยกวิเคราะห์เป็นตัวเลขและบางส่วน อาจจะไม่.

จากการทดสอบฟังก์ชั่นทั้ง 10 ฟังก์ชั่นที่ตรงกับความต้องการของ OP คือ [1,3,5,6,8,9]


0

เงื่อนไขสำหรับการตรวจสอบลอย:

if (lnk.value == +lnk.value && lnk.value != (lnk.value | 0)) 

เงื่อนไขสำหรับการตรวจสอบจำนวนเต็ม:

if (lnk.value == +lnk.value && lnk.value == (lnk.value | 0)) 

หวังว่านี่อาจจะเป็นประโยชน์


0
function int(a) {
  return a - a === 0 && a.toString(32).indexOf('.') === -1
}

function float(a) {
  return a - a === 0 && a.toString(32).indexOf('.') !== -1
}

คุณสามารถเพิ่มtypeof a === 'number'ถ้าคุณต้องการที่จะไม่รวมสตริง

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