නූලක් වලංගු අංකයක් දැයි පරීක්ෂා කිරීමට ජාවාස්ක්‍රිප්ට් හි (බිල්ට්-ඉන්) මාර්ගය


1232

පැරණි VB6 IsNumeric()ශ්‍රිතයට සමාන සංකල්පීය අවකාශයක යමක් ඇතැයි මම බලාපොරොත්තු වෙමි ?


3
මීට කලකට පෙර මා ඇසූ මේ සම්බන්ධ ප්‍රශ්නය බලන්න .
මයිකල් හරන්

39
ඔබ මෙම ප්‍රශ්නයට ගියහොත්, සියලුම රෙජෙක්ස් පිළිතුරු මඟ හැරීමට උත්සාහ කරන්න. එය කළ හැකි ක්‍රමය පමණක් නොවේ.
ජොයෙල් කොහූර්න්

14
යමෙකුට එය හරියටම කිරීමට අවශ්‍ය නැතිනම්: දී ඇති නූලකට වලංගු ඉලක්කම් ප්‍රවාහයක ආකෘතියක් තිබේදැයි පරීක්ෂා කිරීම. එසේනම් එය වැරදි විය යුත්තේ ඇයි?
සාස්ක්

18
තෝරාගත් පිළිතුර වැරදියි !!! එහි අදහස් බලන්න, නමුත් මූලික වශයෙන් එය උදා සමග අසමත් isNaN(""), isNaN(" "), isNaN(false)එය නැවත ආදිය, falseඔවුන් සංඛ්යා බව හඟවමින්, මේ සඳහා.
ඇන්ඩෲ

1
එබැවින් තෝරාගත් පිළිතුර වැරදියි, රීජෙක්ස්ප් එය කළ හැකි ක්‍රමය නොවේ. එවිට නිවැරදි වන්නේ කුමක්ද?
vir us

Answers:


2395

විචල්යයක් (නූලක් ඇතුළුව) අංකයක් දැයි පරීක්ෂා කිරීමට, එය අංකයක් නොවේදැයි පරීක්ෂා කරන්න:

විචල්ය අන්තර්ගතය නූල් හෝ අංකයක් නොසලකා මෙය ක්රියා කරයි.

isNaN(num)         // returns true if the variable does NOT contain a valid number

උදාහරණ

isNaN(123)         // false
isNaN('123')       // false
isNaN('1e10000')   // false (This translates to Infinity, which is a number)
isNaN('foo')       // true
isNaN('10px')      // true

ඇත්ත වශයෙන්ම, ඔබට අවශ්‍ය නම් මෙය ප්‍රතික්ෂේප කළ හැකිය. උදාහරණයක් ලෙස, IsNumericඔබ දුන් ආදර්ශය ක්‍රියාත්මක කිරීමට :

function isNumeric(num){
  return !isNaN(num)
}

අංකයක් අඩංගු නූලක් අංකයක් බවට පරිවර්තනය කිරීම සඳහා:

නූල් සංඛ්‍යාත්මක අක්ෂර පමණක් අඩංගු වන්නේ නම් පමණක් ක්‍රියාත්මක වේ, එසේ නොමැතිනම් එය නැවත පැමිණේ NaN.

+num               // returns the numeric value of the string, or NaN 
                   // if the string isn't purely numeric characters

උදාහරණ

+'12'              // 12
+'12.'             // 12
+'12..'            // NaN
+'.12'             // 0.12
+'..12'            // NaN
+'foo'             // NaN
+'12px'            // NaN

නූලක් ලිහිල්ව අංකයකට පරිවර්තනය කිරීම

'12px' 12 බවට පරිවර්තනය කිරීම සඳහා ප්‍රයෝජනවත් වේ, උදාහරණයක් ලෙස:

parseInt(num)      // extracts a numeric value from the 
                   // start of the string, or NaN.

උදාහරණ

parseInt('12')     // 12
parseInt('aaa')    // NaN
parseInt('12px')   // 12
parseInt('foo2')   // NaN      These last two may be different
parseInt('12a5')   // 12       from what you expected to see. 

පාවෙන

(නමට අනුව) මෙන් නොව +num, parseIntදශම ලක්ෂයට පසුව සෑම දෙයක්ම කපා හැරීමෙන් පාවෙන සංඛ්‍යාවක් පූර්ණ සංඛ්‍යාවක් බවට පරිවර්තනය වන බව මතක තබා ගන්න ( මෙම හැසිරීම parseInt() නිසා ඔබට භාවිතා කිරීමට අවශ්‍ය නම් , ඒ වෙනුවට වෙනත් ක්‍රමයක් භාවිතා කිරීමට වඩා හොඳය ) :

+'12.345'          // 12.345
parseInt(12.345)   // 12
parseInt('12.345') // 12

හිස් නූල්

හිස් නූල් ටිකක් ප්‍රති-බුද්ධිමත් විය හැකිය. +numහිස් නූල් හෝ නූල් අවකාශය ශුන්‍ය බවට පරිවර්තනය කරයි, සහ isNaN()එයම උපකල්පනය කරයි:

+''                // 0
+'   '             // 0
isNaN('')          // false
isNaN('   ')       // false

නමුත් parseInt()එකඟ නොවේ:

parseInt('')       // NaN
parseInt('   ')    // NaN

135
ParseInt පිළිබඳ ඉතා වැදගත් සටහනක් නම්, එය නූලක් int බවට පරිවර්තනය කිරීම සඳහා රේඩික්ස් එකක් නියම කිරීමට ඔබට ඉඩ සලසයි. ඔබ එය සපයන්නේ නැත්නම් ඔබ වෙනුවෙන් රේඩික්ස් අනුමාන කිරීමට උත්සාහ කරන බැවින් මෙය විශාල ගොචා වේ. උදාහරණයක් ලෙස: parseInt ("17") ප්‍රති results ල 17 (දශම, 10), නමුත් parseInt ("08") ප්‍රති results ල 0 (අෂ්ටක, 8) වේ. එබැවින්, ඔබ වෙනත් ආකාරයකින් අදහස් නොකරන්නේ නම්, parseInt (අංකය, 10) භාවිතා කිරීම ආරක්ෂිත වේ.
ඇඩම් රානි

38
IsNaN (නිර්වචනය නොකළ) ප්‍රතිලාභ අසත්‍ය බව සලකන්න.
ඩේවිඩ් හෙල්සිං

121
මෙය සරල වැරැද්දකි - එය එතරම් ඉහළ නැංවීමක් සිදු කළේ කෙසේද? ඔබට isNaN"විචල්‍යයක් අංකයක් නොවේදැයි බැලීමට" භාවිතා කළ නොහැක . "අංකයක් නොවේ" යනු "IEEE-794 NaN" ට සමාන නොවේ isNaN. අවම වශයෙන්, බූලියන් සහ හිස් නූල් පරීක්ෂා කිරීමේදී මෙම භාවිතය අසාර්ථක වේ. බලන්න developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... .
ඊඑම්එල්

47
යමක් සංඛ්‍යාවක් දැයි පරීක්ෂා කිරීමට වේගවත්ම ක්‍රමය වන්නේ “ස්වයං හා සමාන” චෙක්පතකි: var n = 'a'; if (+n === +n) { // is number }එය ක්‍රෝම් හි නවතම අනුවාදයේ isNaN ට වඩා ~ 3994% වේගවත් වේ. කාර්ය සාධන පරීක්ෂණය මෙතැනින් බලන්න: jsperf.com/isnan-vs-typeof/5
කෙවින් ජුර්කොව්ස්කි

23
** අවවාදයයි ** මෙම පිළිතුර වැරදිය. ඔබේම අවදානමකට භාවිතා කරන්න. උදාහරණය:isNaN(1 + false + parseInt("1.do you trust your users?"))
keithpjolley

56

ඔබට RegExp මාර්ගයට යා හැකිය:

var num = "987238";

if(num.match(/^-{0,1}\d+$/)){
  //valid integer (positive or negative)
}else if(num.match(/^\d+\.\d+$/)){
  //valid float
}else{
  //not valid number
}

40
මෙම අවස්ථාවේ දී, RegExp == නරක
ජොයෙල් කොහූර්න්

10
මෙය ෂඩාස්රාකාර සංඛ්‍යා (0x12, උදාහරණයක් ලෙස) මත අසමත් වේ, ප්‍රමුඛ ශුන්‍යයකින් තොරව පාවෙයි (.42, උදාහරණයක් ලෙස) සහ negative ණ සංඛ්‍යා.
ඔරි

17
EJoelCoehoorn RegExp == මෙහි නරක ඇයි? මට වලංගු භාවිතයක් ලෙස පෙනේ.
කම්පියුට්‍රියස්

6
අංකයක් තැනීමට වඩා වැඩි ක්‍රම තිබේ (තවත් විවරණයක හෙක්ස් අංක එක් උදාහරණයක් පමණි), සහ වලංගු යැයි නොසැලකිය හැකි බොහෝ සංඛ්‍යා ඇත (වර්ගය පිටාර ගැලීම, ඉතා නිරවද්‍ය යනාදිය). එසේම, රීජෙක්ස් යනු සාදන ලද යාන්ත්‍රණයන් භාවිතා කරනවාට වඩා මන්දගාමී හා සංකීර්ණ ය
ජොයෙල් කොහූර්න්

1
විද්‍යාත්මක අංකනයට ද අනුරූප විය යුතුය ... 1e10 යනාදිය
ජෝශප් මර්ඩ්රිග්නැක්

55

ඔබ නූලක් සම්පූර්ණ සංඛ්‍යාවක් දැයි බැලීමට උත්සාහ කරන්නේ නම් (දශම ස්ථාන නොමැත), රීජෙක්ස් යන්න හොඳ ක්‍රමයකි. isNaNඑතරම් සරල දෙයකට වඩා සංකීර්ණ වන වෙනත් ක්‍රම .

function isNumeric(value) {
    return /^-{0,1}\d+$/.test(value);
}

console.log(isNumeric('abcd'));         // false
console.log(isNumeric('123a'));         // false
console.log(isNumeric('1'));            // true
console.log(isNumeric('1234567890'));   // true
console.log(isNumeric('-23'));          // true
console.log(isNumeric(1234));           // true
console.log(isNumeric('123.4'));        // false
console.log(isNumeric(''));             // false
console.log(isNumeric(undefined));      // false
console.log(isNumeric(null));           // false

ධනාත්මක සම්පූර්ණ සංඛ්‍යා වලට පමණක් ඉඩ දීම සඳහා මෙය භාවිතා කරන්න:

function isNumeric(value) {
    return /^\d+$/.test(value);
}

console.log(isNumeric('123'));          // true
console.log(isNumeric('-23'));          // false

11
console.log (isNumeric ('- 1'));
යොංනාන්

5
console.log (isNumeric ('2e2'));
ගෝල් බාබින්

12
සමහර විට "isNumeric" ලෙස "hasOnlyDigits" ලෙස නම් කරන්න. බොහෝ අවස්ථාවන්හීදී, ඔබ සොයන චෙක්පත එයයි.
gus3001

2
මෙය මා සොයමින් සිටියේ php ctype_digit ට සමානයි
මිගෙල් පයින්ටෝ

42

මෙම ප්‍රශ්නයට පිළිගත් පිළිතුරෙහි අඩුපාඩු කිහිපයක් තිබේ (වෙනත් පරිශීලකයින් කිහිප දෙනෙකු විසින් ඉස්මතු කර ඇති පරිදි). මෙය ජාවාස්ක්‍රිප්ට් වලින් ප්‍රවේශ වීමට ඇති පහසුම සහ ඔප්පු කළ හැකි ක්‍රමයකි:

function isNumeric(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

පහත දැක්වෙන්නේ හොඳ පරීක්ෂණ අවස්ථා කිහිපයක්:

console.log(isNumeric(12345678912345678912)); // true
console.log(isNumeric('2 '));                 // true
console.log(isNumeric('-32.2 '));             // true
console.log(isNumeric(-32.2));                // true
console.log(isNumeric(undefined));            // false

// the accepted answer fails at these tests:
console.log(isNumeric(''));                   // false
console.log(isNumeric(null));                 // false
console.log(isNumeric([]));                   // false

37

ඔබ ඇත්තටම විශ්වාසද වැලක් පමණක් අංකය, ඕනෑම අංකය (පූර්ණ සංඛ්යාවක් හෝ ඉපිලුම් ලක්ෂ්ය), සහ හරියටම ගණනාවක් අඩංගු කිරීමට අවශ්ය නම්, ඔබ කළ නොහැකි භාවිතා parseInt()/ parseFloat(), Number()හෝ !isNaN()තමන් විසින්. බව සටහන !isNaN()ඇත්තටම ආපසු පැමිනෙමින් trueවිට Number()ගණනාවක් ඇති බවත් නැවත, හා falseඑය ආපසු කවදාදNaN , ඒ නිසා මම සාකච්ඡා ඉතිරි සිට එය ඉවත් කරනු ඇත.

ඇති ප්රශ්නය parseFloat()එය, වැල ඕනෑම අංකය අඩංගු නම් ගණනාවක් නැවත බව වැල අඩංගු නොවේ පවා නම් වේ පමණක් සහ හරියටම ගණනාවක්:

parseFloat("2016-12-31")  // returns 2016
parseFloat("1-1") // return 1
parseFloat("1.2.3") // returns 1.2

ගැටළුව Number()වන්නේ සම්මත අගය කිසිසේත්ම සංඛ්‍යාවක් නොවන අවස්ථාවන්හිදී එය සංඛ්‍යාවක් ආපසු ලබා දීමයි!

Number("") // returns 0
Number(" ") // returns 0
Number(" \u00A0   \t\n\r") // returns 0

ඔබේම රීජෙක්ස් රෝල් කිරීමේ ගැටළුව නම්, ඔබ ජාවාස්ක්‍රිප්ට් විසින් හඳුනාගෙන ඇති පරිදි පාවෙන ලක්ෂ්‍ය අංකයක් ගැලපීම සඳහා නිශ්චිත රීජෙක්ස් නිර්මාණය නොකළහොත් ඔබට නඩු මඟ හැරීමට හෝ ඔබ නොකළ යුතු අවස්ථා හඳුනා ගැනීමට සිදුවීමයි. ඔබට ඔබේම රිජෙක්ස් රෝල් කළ හැකි වුවද, ඇයි? එය කිරීමට වඩා සරල නිමැවුම් ක්‍රම තිබේ.

කෙසේ වෙතත්, සංඛ්‍යාවක් හැරවිය යුතු සෑම අවස්ථාවකටම Number()(සහ isNaN()) නිවැරදි දේ කරන බව පෙනේ parseFloat(), සහ අනෙක් අතට. එබැවින් නූලක් හරියටම හරියටම හා සංඛ්‍යාවක් පමණක් දැයි සොයා ගැනීමට, ශ්‍රිත දෙකම අමතා ඒවා දෙකම සත්‍යයක් දැයි බලන්න :

function isNumber(str) {
  if (typeof str != "string") return false // we only process strings!
  // could also coerce to string: str = ""+str
  return !isNaN(str) && !isNaN(parseFloat(str))
}

2
නූලට ප්‍රමුඛ හෝ පසුපස අවකාශ ඇති විට මෙය සත්‍ය වේ. ' 1', '2 'සහ ' 3 'සියල්ල නැවත සත්‍ය වේ.
රූඩි

ආපසු ප්‍රකාශයට මෙවැනි දෙයක් එකතු කිරීමෙන් එය විසඳෙනු ඇත: &&! / ^ \ S + | \ s + $ / g.test (str)
අල්ට්‍රෝමන් ද ටකෝමන්

2
U රඩ්ලෙන්ඩර්ස් - නූල වලංගු අංකයක් බවට පත් කිරීම සඳහා අක්‍රීයව ඇති අවකාශයන් තිබේදැයි බොහෝ අය ගණන් ගන්නේ නැත, මන්ද යත්, අතුරු මුහුණත් රාශියක අමතර අවකාශයන් අහම්බෙන් තැබීම පහසුය.
ඉයන්

3
පරිශීලක ආදානයෙන් අංක පේළිය පැමිණෙන්නේ නම් එය සත්‍යයකි. නමුත් මම සිතුවේ මම කෙසේ හෝ අවකාශයන් සඳහන් කළ යුතු බවයි, මන්ද මම සිතන්නේ isNumberශ්‍රිතයක් අවශ්‍ය බොහෝ අය පරිශීලක අතුරුමුහුණත් සමඟ කටයුතු නොකරන බවයි. එසේම, හොඳ සංඛ්‍යා ආදානයක් මඟින් අවකාශය ආරම්භ කිරීමට ඉඩ නොදේ.
රූඩි

24

IsNan ශ්‍රිතය උත්සාහ කරන්න :

IsNaN () ශ්‍රිතය මඟින් අගය නීති විරෝධී අංකයක්ද යන්න තීරණය කරයි (අංකයක් නොවේ).

අගය NaN ට සමාන නම් මෙම ශ්‍රිතය සත්‍ය වේ. එසේ නොමැතිනම් එය සාවද්‍ය ය.

මෙම ශ්‍රිතය සංඛ්‍යා විශේෂිත අංක. IsNaN () ක්‍රමයට වඩා වෙනස් වේ .

  ගෝලීය isNaN () ශ්‍රිතය, පරීක්ෂා කළ අගය අංකයක් බවට පරිවර්තනය කර එය පරීක්ෂා කරයි.

Number.isNan () මඟින් අගයන් සංඛ්‍යාවක් බවට පරිවර්තනය නොකරන අතර අංකයේ වර්ගයට අයත් නොවන කිසිදු අගයක් සඳහා සත්‍ය නොවේ.


2
හිස් නූල සඳහා චෙක්පතක් එක් කිරීමට වග බලා ගන්න. isNaN ('') අසත්‍යය ලබා දෙන නමුත් ඔබට එය සත්‍යයක් බවට පත්වීමට අවශ්‍ය වනු ඇත.
මයිකල් හරන්

3
isFinite වඩා හොඳ චෙක්පතකි - එය ඉන්ෆිනිටි හි
දරුණුතම

3
Ic මයිකල්හරන් ප්‍රමාණවත් නොවේ! '\ u00A0' වැනි දේ ඇතුළුව සුදු පැහැති අක්ෂර පමණක් අඩංගු ඕනෑම නූලක් සඳහා isNaN()ප්‍රතිලාභ . false
මයිකල්

2
අවවාදයයි: අගයන් සඳහා ක්‍රියා නොකරයි: ශුන්‍ය, "" (හිස් නූල) සහ අසත්‍යය.
ජෙනී ඕ රෙයිලි

මෙම පිළිතුර වසර 11 කට පෙර සහ පිළිගත් පිළිතුරට මිනිත්තු කිහිපයකට පෙර ලබා දී ඇති බව මට වැටහී ඇත, නමුත් එයට කැමති හෝ නැතත්, පිළිගත් පිළිතුරට ඒ වටා තවත් සංවාදයක් ඇත, එබැවින් මෙම පිළිතුර ප්‍රශ්නයට පිළිතුරු දීමට කිසිවක් එකතු නොකරයි. නව පා .කයන්ගේ අවධානය වෙනතකට යොමු නොකිරීමට මම එය මකා දැමීමට කාරුණිකව යෝජනා කරමි. මම හිතන්නේ ඔබ එය කළහොත් ඔබට විනය බැජ් එක ලැබෙනු ඇත.
ඩෑන් ඩස්කල්ස්කු

14

පැරණි ප්‍රශ්නය, නමුත් ලබා දී ඇති පිළිතුරු වල කරුණු කිහිපයක් නොමැත.

විද්‍යාත්මක අංකනය.

!isNaN('1e+30')වන trueජනතාව අංක ඉල්ලන විට, ඔවුන් වැනි දේවල් ගැලපෙන ඕන නෑ කෙසේ වෙතත් බොහෝ සිදුවීම් තුල දී,1e+30 .

විශාල පාවෙන සංඛ්‍යා අමුතු ලෙස හැසිරෙනු ඇත

නිරීක්ෂණය කරන්න (Node.js භාවිතා කරමින්):

> var s = Array(16 + 1).join('9')
undefined
> s.length
16
> s
'9999999999999999'
> !isNaN(s)
true
> Number(s)
10000000000000000
> String(Number(s)) === s
false
>

අනිත් අතට:

> var s = Array(16 + 1).join('1')
undefined
> String(Number(s)) === s
true
> var s = Array(15 + 1).join('9')
undefined
> String(Number(s)) === s
true
>

ඉතින්, යමෙක් අපේක්ෂා කරන්නේ නම් String(Number(s)) === s , ඔබේ නූල් උපරිම වශයෙන් ඉලක්කම් 15 කට සීමා කරන්න (ප්‍රමුඛ ශුන්‍යයන් මඟ හැරීමෙන් පසු).

අනන්තය

> typeof Infinity
'number'
> !isNaN('Infinity')
true
> isFinite('Infinity')
false
>

මේ සියල්ල සැලකිල්ලට ගෙන, දී ඇති නූල පහත සඳහන් සියල්ල තෘප්තිමත් කරන සංඛ්‍යාවක් දැයි පරීක්ෂා කිරීම:

  • විද්‍යාත්මක නොවන අංකනය
  • පුරෝකථනය කළ හැකි පරිවර්තනය වෙත Numberසහ ආපසුString
  • සීමිතයි

එතරම් පහසු කාර්යයක් නොවේ. මෙන්න සරල අනුවාදයක්:

  function isNonScientificNumberString(o) {
    if (!o || typeof o !== 'string') {
      // Should not be given anything but strings.
      return false;
    }
    return o.length <= 15 && o.indexOf('e+') < 0 && o.indexOf('E+') < 0 && !isNaN(o) && isFinite(o);
  }

කෙසේ වෙතත්, මෙය පවා සම්පුර්ණ නැත. ප්‍රමුඛ ශුන්‍යයන් මෙහි හසුරුවනු නොලැබේ, නමුත් ඒවා දිග පරීක්ෂණය ඉස්කුරුප්පු කරයි.


2
"කෙසේ වෙතත් බොහෝ අවස්ථාවන්හිදී මිනිසුන් අංක ඉල්ලන විට 1e + 30 වැනි දේ ගැලපීමට ඔවුන්ට අවශ්‍ය නැත" ඇයි ඔබ මෙය කියන්නේ? නූලක අංකයක් තිබේදැයි යමෙකුට දැන ගැනීමට අවශ්‍ය නම්, එය අංකයක් අඩංගු දැයි දැන ගැනීමට ඔවුන්ට අවශ්‍ය බව මට පෙනේ, 1e + 30 යනු අංකයකි. නිසැකවම මම ජාවාස්ක්‍රිප්ට් හි සංඛ්‍යාත්මක අගයක් සඳහා නූලක් පරීක්ෂා කරන්නේ නම්, එය ගැලපීමට මට අවශ්‍යය.
ඩෑන් ජෝන්ස්

9

මම පරීක්ෂා කර ඇති අතර මයිකල්ගේ විසඳුම හොඳම වේ. ඉහත ඔහුගේ පිළිතුර සඳහා ඡන්දය දෙන්න (එය සොයා ගැනීම සඳහා "ඔබට ඇත්තටම අවශ්‍ය නම්" යනුවෙන් මෙම පිටුව සොයන්න). සාරාංශයක් ලෙස, ඔහුගේ පිළිතුර මෙයයි:

function isNumeric(num){
  num = "" + num; //coerce num to be a string
  return !isNaN(num) && !isNaN(parseFloat(num));
}

මා මෙහි ලේඛනගත කළ සෑම පරීක්ෂණ අවස්ථාවකටම එය ක්‍රියා කරයි: https://jsfiddle.net/wggehvp9/5/

මෙම විසඳුම් සඳහා වෙනත් බොහෝ විසඳුම් අසමත් වේ: '', ශුන්‍ය, "", සත්‍ය සහ []. න්‍යාය අනුව, නිසි දෝෂ හැසිරවීමෙන් ඔබට ඒවා භාවිතා කළ හැකිය: උදාහරණයක් ලෙස:

return !isNaN(num);

හෝ

return (+num === +num);

/ \ s /, ශුන්‍ය, "", සත්‍ය, අසත්‍ය, [] (සහ වෙනත් අය?)


1
පසුපස / ප්‍රමුඛ අවකාශයන් සමඟ මෙය තවමත් සත්‍ය වේ. ආපසු ප්‍රකාශයට මෙවැනි දෙයක් එකතු කිරීමෙන් එය විසඳෙනු ඇත: &&! / ^ \ S + | \ s + $ / g.test (str)
අල්ට්‍රෝමන් ද ටකෝමන්

2
ඉතින් '123' අසත්‍ය විය යුතුය, අංකයක් නොව, '1234' අංකයක් විය යුතුද? එය කෙසේ දැයි මම කැමතියි, එවිට "123" යනු අංකයකි, නමුත් ප්‍රමුඛ හෝ පසුපස අවකාශයන් අගය වෙනස් කළ යුතු නම් එය සංවර්ධකයාගේ අභිමතය පරිදි විය හැකිය.
JohnP2

8

තර්කයක් එහි ඉදිකිරීම්කරු වෙත යොමු කිරීමේදී ඔබට අංකයේ ප්‍රති result ලය භාවිතා කළ හැකිය .

තර්කය (නූලක්) අංකයක් බවට පරිවර්තනය කළ නොහැකි නම්, එය NaN නැවත ලබා දෙයි, එබැවින් ලබා දී ඇති නූල වලංගු අංකයක්ද නැද්ද යන්න ඔබට තීරණය කළ හැකිය.

සටහන්: සටහන හිස් අගයක් හෝ එක්විමට '\t\t'හා '\n\t'අංකය 0 ආපසු කවෙර්ද; සත්‍යය පසු කිරීමෙන් 1 සහ ව්‍යාජ ප්‍රතිලාභ 0 ලැබේ.

    Number('34.00') // 34
    Number('-34') // -34
    Number('123e5') // 12300000
    Number('123e-5') // 0.00123
    Number('999999999999') // 999999999999
    Number('9999999999999999') // 10000000000000000 (integer accuracy up to 15 digit)
    Number('0xFF') // 255
    Number('Infinity') // Infinity  

    Number('34px') // NaN
    Number('xyz') // NaN
    Number('true') // NaN
    Number('false') // NaN

    // cavets
    Number('    ') // 0
    Number('\t\t') // 0
    Number('\n\t') // 0

මෙම Numberඉදිකිරීමටත් ලෙස හරියටම සමාන වන්නේ +x.
ග්‍රෙග්‍රොස්

පැත්තක නෝට්ටු ලෙස, මෙම ES6 බව මතක තබා Number()හැන්ඩ්ල් මෙන්ම අංක පාවෙන, වැනි Number.parseFloat()නෑNumber.parseInt()
zurfyx

8

සමහර විට මෙම ප්‍රශ්නයට එක් අයෙකු හෝ දෙදෙනෙකු පැමිණ ඇති අතර ඔවුන්ට වෙනදාට වඩා දැඩි පරීක්ෂණයක් අවශ්‍ය වේ (මා කළාක් මෙන්). එවැනි අවස්ථාවක, මෙය ප්‍රයෝජනවත් විය හැකිය:

if(str === String(Number(str))) {
  // it's a "perfectly formatted" number
}

පරෙස්සම් වන්න! මේ වගේ නූල් ප්රතික්ෂේප කරනු ඇත .1, 40.000, 080, 00.1. එය ඉතා අච්චාරු - නූල් " අවම අවම ආකෘතියට අනුරූප විය යුතුය මෙම පරීක්ෂණය සමත් වීම සඳහා ” අනුරූප විය යුතුය.

එය අංකයකට නැවත නැවත වාත්තු කිරීම සඳහා Stringසහ Numberඉදිකිරීම්කරු භාවිතා කරන අතර එමඟින් ජාවාස්ක්‍රිප්ට් එන්ජිමේ “පරිපූර්ණ අවම ස්වරූපය” (ආරම්භක Numberඉදිකිරීම්කරු සමඟ එය පරිවර්තනය කර ඇති ) මුල් නූලට ගැලපේදැයි පරීක්ෂා කරයි.


2
ස්තූතියි oJoeRocc. මට මෙයද අවශ්‍ය විය, නමුත් පූර්ණ සංඛ්‍යා සඳහා පමණි, එබැවින් මම එකතු කළෙමි : (str === String(Math.round(Number(str)))).
keithpjolley

බව දැනුවත් විය "Infinity", "-Infinity"සහ "NaN"මෙම පරීක්ෂණයෙන් සමත්. කෙසේ වෙතත්, අතිරේක Number.isFiniteපරීක්ෂණයකින් මෙය නිවැරදි කළ හැකිය .
ග්‍රෙග්‍රොස්

මෙය හරියටම සමාන වේ str === ("" + +str). එය මූලික වශයෙන් පරික්ෂා කරන්නේ JS අංකයක් නූල් කිරීමේ ප්‍රති result ලයද යන්නයි. මෙය දැන ගැනීමෙන් අපට ගැටළුවක් ද දැකිය හැකිය: පරීක්ෂණය සමත් 0.000001වුවද අසමත් වේ 0.0000001, ඒ 1e-7වෙනුවට සමත් වන විට ය . ඉතා විශාල සංඛ්යා සඳහා සමාන වේ.
ග්‍රෙග්‍රොස්

5

parseInt (), නමුත් මෙම ශ්‍රිතය ටිකක් වෙනස් බව මතක තබා ගන්න, එය උදාහරණයක් ලෙස parseInt සඳහා 100 ක් ලබා දෙයි ("100px").


සහ 11 සඳහා parseInt(09).
djechlin

10
ඔබ භාවිතා කිරීමට අවශ්‍ය නිසාparaseInt(09, 10)
Gavin

1
පුළුල් බ්‍රව්සර් සහය (IE≥9) ඇති ECMAScript 5 හි ඔබට තවදුරටත් , 10තර්කය අවශ්‍ය නොවේ . parseInt('09')දැන් 9 ට සමානයි.
රෝරි ඕ'කේන්

5

2019: ප්‍රායෝගික හා තද සංඛ්‍යාත්මක වලංගුභාවය පරීක්ෂා කිරීම

බොහෝ විට, 'වලංගු අංකයක්' යනු NaN සහ Infinity හැර ජාවාස්ක්‍රිප්ට් අංකයකි, එනම් 'සීමිත අංකයකි'.

අගයක සංඛ්‍යාත්මක වලංගුභාවය පරීක්ෂා කිරීම සඳහා (උදාහරණයක් ලෙස බාහිර ප්‍රභවයකින්), ඔබට ESlint Airbnb ශෛලියෙන් අර්ථ දැක්විය හැකිය:

/**
 * Returns true if 'candidate' is a finite number or a string referring (not just 'including') a finite number
 * To keep in mind:
 *   Number(true) = 1
 *   Number('') = 0
 *   Number("   10  ") = 10
 *   !isNaN(true) = true
 *   parseFloat('10 a') = 10
 *
 * @param {?} candidate
 * @return {boolean}
 */
function isReferringFiniteNumber(candidate) {
  if (typeof (candidate) === 'number') return Number.isFinite(candidate);
  if (typeof (candidate) === 'string') {
    return (candidate.trim() !== '') && Number.isFinite(Number(candidate));
  }
  return false;
}

එය මේ ආකාරයෙන් භාවිතා කරන්න:

if (isReferringFiniteNumber(theirValue)) {
  myCheckedValue = Number(theirValue);
} else {
  console.warn('The provided value doesn\'t refer to a finite number');
}

විශිෂ්ටයි. ස්තූතියි! 👋
ගොලිජර්

4

උපුටා ගැනීම:

විචල්‍යයේ වලංගු අංකයක් නොමැති නම් isNaN (num) // සත්‍ය වේ

ඔබට ප්‍රමුඛ / පසුපස අවකාශයන් පරික්ෂා කිරීමට අවශ්‍ය නම් එය සම්පූර්ණයෙන්ම සත්‍ය නොවේ - නිදසුනක් ලෙස නිශ්චිත ඉලක්කම් ප්‍රමාණයක් අවශ්‍ය වූ විට, සහ ඔබට අවශ්‍ය වන්නේ '1111' යැයි පැවසිය යුතු අතර සමහර විට PIN සඳහා '111' හෝ '111' නොවේ. ආදානය.

භාවිතා කිරීමට වඩා හොඳ:

var num = /^\d+$/.test(num)

සාරධර්ම '-1', '0.1'සහ '1e10'සියල්ල ආපසු වැරදි ය. තවද, ධනාත්මක අනන්තයට වඩා විශාල හෝ negative ණ අනන්තයට වඩා කුඩා අගයන් සත්‍ය වන අතර ඒවා බොහෝ විට අසත්‍ය විය යුතුය.
රූඩි

4

JQuery ක්‍රියාත්මක කිරීම ප්‍රමාණවත් නොවන්නේ ඇයි?

function isNumeric(a) {
    var b = a && a.toString();
    return !$.isArray(a) && b - parseFloat(b) + 1 >= 0;
};

මයිකල් මේ වගේ දෙයක් යෝජනා කළා (මම "user1691651 - ජෝන් මෙහි වෙනස් කළ අනුවාදය සොරකම් කළත්):

function isNumeric(num){
    num = "" + num; //coerce num to be a string
    return !isNaN(num) && !isNaN(parseFloat(num));
}

පහත දැක්වෙන්නේ බොහෝ දුරට නරක ක්‍රියාකාරිත්වය සහිත විසඳුමකි, නමුත් solid න ප්‍රති .ල. එය jQuery 1.12.4 ක්‍රියාත්මක කිරීම සහ මයිකල්ගේ පිළිතුර, ප්‍රමුඛ / පසුපස අවකාශයන් සඳහා අමතර පරීක්‍ෂණයක් සමඟ සාදන ලද ප්‍රතිවිරෝධයකි (මක්නිසාද යත් මයිකල්ගේ අනුවාදය ප්‍රමුඛ / පසුපස අවකාශයන් සහිත සංඛ්‍යා සඳහා සත්‍ය වන බැවිනි):

function isNumeric(a) {
    var str = a + "";
    var b = a && a.toString();
    return !$.isArray(a) && b - parseFloat(b) + 1 >= 0 &&
           !/^\s+|\s+$/g.test(str) &&
           !isNaN(str) && !isNaN(parseFloat(str));
};

දෙවන අනුවාදයට නව විචල්‍යයන් දෙකක් ඇත. එසේ කිරීමෙන් කෙනෙකුට එයින් එකක් ලබා ගත හැකිය:

function isNumeric(a) {
    if ($.isArray(a)) return false;
    var b = a && a.toString();
    a = a + "";
    return b - parseFloat(b) + 1 >= 0 &&
            !/^\s+|\s+$/g.test(a) &&
            !isNaN(a) && !isNaN(parseFloat(a));
};

මම මේ කිසිවක් එතරම් පරීක්‍ෂා කර නැත, වෙනත් ආකාරයකින් මා භාවිතා කරන අවස්ථා කිහිපයක් අතින් පරීක්‍ෂා කිරීම හැරෙන්නට, මගේ වර්තමාන අවාසනාවන්ත තත්ත්වයට මම පහර දෙමි. මෙය "යෝධයන්ගේ උරහිස් මත සිටගෙන සිටීම" තත්වයකි.


4

2019: ES3, ES6 සහ TypeScript උදාහරණ ඇතුළුව

සමහර විට මෙය බොහෝ වාර ගණනක් නැවත සකස් කර ඇත, කෙසේ වෙතත් මම අදත් මේ සමඟ සටන් කර මගේ පිළිතුර පළ කිරීමට කැමැත්තෙමි, මන්ද එය වෙනත් පිළිතුරක් සරලව හෝ තරයේම දැක නැති නිසාය:

ES3

var isNumeric = function(num){
    return (typeof(num) === 'number' || typeof(num) === "string" && num.trim() !== '') && !isNaN(num);  
}

ES6

const isNumeric = (num) => (typeof(num) === 'number' || typeof(num) === "string" && num.trim() !== '') && !isNaN(num);

යතුරු ලියනය

const isNumeric = (num: any) => (typeof(num) === 'number' || typeof(num) === "string" && num.trim() !== '') && !isNaN(num as number);

මෙය තරමක් සරල යැයි පෙනෙන අතර වෙනත් බොහෝ තනතුරු වල මා දුටු සියලු පදනම් ආවරණය කර මා ගැනම සිතුවෙමි:

// Positive Cases
console.log(0, isNumeric(0) === true);
console.log(1, isNumeric(1) === true);
console.log(1234567890, isNumeric(1234567890) === true);
console.log('1234567890', isNumeric('1234567890') === true);
console.log('0', isNumeric('0') === true);
console.log('1', isNumeric('1') === true);
console.log('1.1', isNumeric('1.1') === true);
console.log('-1', isNumeric('-1') === true);
console.log('-1.2354', isNumeric('-1.2354') === true);
console.log('-1234567890', isNumeric('-1234567890') === true);
console.log(-1, isNumeric(-1) === true);
console.log(-32.1, isNumeric(-32.1) === true);
console.log('0x1', isNumeric('0x1') === true);  // Valid number in hex
// Negative Cases
console.log(true, isNumeric(true) === false);
console.log(false, isNumeric(false) === false);
console.log('1..1', isNumeric('1..1') === false);
console.log('1,1', isNumeric('1,1') === false);
console.log('-32.1.12', isNumeric('-32.1.12') === false);
console.log('[blank]', isNumeric('') === false);
console.log('[spaces]', isNumeric('   ') === false);
console.log('null', isNumeric(null) === false);
console.log('undefined', isNumeric(undefined) === false);
console.log([], isNumeric([]) === false);
console.log('NaN', isNumeric(NaN) === false);

ඔබට ඔබේම උත්සාහ කළ හැකිය isNumeric ක්‍රියාකාරිත්වය අතර මෙම භාවිත අවස්ථා වලදී අතීතයට ගොස් ඒවා සියල්ලටම “සත්‍ය” සඳහා පරිලෝකනය කළ හැකිය.

නැතහොත්, එක් එක් ප්‍රතිලාභ ලබා දෙන අගයන් බැලීමට:

<code> isNumeric () </code> ට එරෙහිව එක් එක් පරීක්ෂණයෙහි ප්‍රති Results ල


3

හොඳයි, මම මේක හැදුවා ...

එය මෙතෙක් ක්‍රියාත්මක වෙමින් පවතී:

function checkNumber(value) {
    if ( value % 1 == 0 )
    return true;
    else
    return false;
}

ඔබට එහි කිසියම් ගැටළුවක් ඇත්නම්, කරුණාකර මට කියන්න.


12
මෙය හිස් නූල, හිස් අරාව, අසත්‍ය සහ ශුන්‍ය සඳහා වැරදි ප්‍රති result ල ලබා දෙයි.
ඔරි

2
එය ත්‍රිත්ව සමාන විය යුතු නොවේද?
ටෝස්ට්_ෆ්ලේක්ස්

1
මගේ යෙදුමේදී අපි ඉඩ දෙන්නේ az AZ සහ අක්ෂර 0-9 පමණි. 0xnn සමඟ නූල ආරම්භ නොවන්නේ නම් එය ඉහත සංඛ්‍යාත්මකව නැවත ලබා දෙනු ඇත.
rwheadon

6
ඔබට කළ හැක්කේ 'ප්‍රතිලාභ අගය% 1 === 0'
බ්‍රයන් ෂර්මර්හෝන්

කරන්නreturn !isNaN(parseInt(value, 10));
DarkNeuron

3

කවුරුහරි මෙය බොහෝ දුරට පහතට වැටුනහොත්, මම මේ මොහොත සමතයකට පත්කිරීමට යම් කාලයක් ගත කළෙමි. ( Https://github.com/moment/moment ). මෙන්න මම එයින් ඉවතට ගත් දෙයක්:

function isNumeric(val) {
    var _val = +val;
    return (val !== val + 1) //infinity check
        && (_val === +val) //Cute coercion check
        && (typeof val !== 'object') //Array/object check
}

පහත සඳහන් අවස්ථා හසුරුවයි:

සැබෑ! :

isNumeric("1"))
isNumeric(1e10))
isNumeric(1E10))
isNumeric(+"6e4"))
isNumeric("1.2222"))
isNumeric("-1.2222"))
isNumeric("-1.222200000000000000"))
isNumeric("1.222200000000000000"))
isNumeric(1))
isNumeric(0))
isNumeric(-0))
isNumeric(1010010293029))
isNumeric(1.100393830000))
isNumeric(Math.LN2))
isNumeric(Math.PI))
isNumeric(5e10))

බොරු! :

isNumeric(NaN))
isNumeric(Infinity))
isNumeric(-Infinity))
isNumeric())
isNumeric(undefined))
isNumeric('[1,2,3]'))
isNumeric({a:1,b:2}))
isNumeric(null))
isNumeric([1]))
isNumeric(new Date()))

හාස්‍යයට කරුණක් නම්, මම වැඩිපුරම අරගල කරන්නේ:

isNumeric(new Number(1)) => false

ඕනෑම යෝජනා සාදරයෙන් පිළිගනිමු. :]


2
ගැන isNumeric(' ')සහ isNumeric('')?
ඇලෙක්ස් කෝරි

මම එක් කරනු && (val.replace(/\s/g,'') !== '') //Empty && (val.slice(-1) !== '.') //Decimal without Numberඉහත සඳහන් ප්රශ්නය හා මම විය එක් සහජීවනය, කිරීම සඳහා.
frankenapps


3
function isNumberCandidate(s) {
  const str = (''+ s).trim();
  if (str.length === 0) return false;
  return !isNaN(+str);
}

console.log(isNumberCandidate('1'));       // true
console.log(isNumberCandidate('a'));       // false
console.log(isNumberCandidate('000'));     // true
console.log(isNumberCandidate('1a'));      // false 
console.log(isNumberCandidate('1e'));      // false
console.log(isNumberCandidate('1e-1'));    // true
console.log(isNumberCandidate('123.3'));   // true
console.log(isNumberCandidate(''));        // false
console.log(isNumberCandidate(' '));       // false
console.log(isNumberCandidate(1));         // true
console.log(isNumberCandidate(0));         // true
console.log(isNumberCandidate(NaN));       // false
console.log(isNumberCandidate(undefined)); // false
console.log(isNumberCandidate(null));      // false
console.log(isNumberCandidate(-1));        // true
console.log(isNumberCandidate('-1'));      // true
console.log(isNumberCandidate('-1.2'));    // true
console.log(isNumberCandidate(0.0000001)); // true
console.log(isNumberCandidate('0.0000001')); // true
console.log(isNumberCandidate(Infinity));    // true
console.log(isNumberCandidate(-Infinity));    // true

console.log(isNumberCandidate('Infinity'));  // true

if (isNumberCandidate(s)) {
  // use +s as a number
  +s ...
}

ස්තූතියි, නියම පිළිතුර!
එම්. අබුල්සූඩ්

3

TypeScript සඳහා එය වලංගු නොවේ:

declare function isNaN(number: number): boolean;

TypeScript සඳහා ඔබට භාවිතා කළ හැකිය:

/^\d+$/.test(key)


/^\d+$/.test("-1") // falseභාවිතා කිරීම isNaNTS-තුළ සංඛ්යා නොවන සමග, ඔබ වටිනා ප්රකාශ කළ හැකි anyඅනෙක් වඩා පුළුල් විසඳුම් භාවිතය එක් මෙතනින් පසුබිම භාවිතය බව හෝ, Number, parseFloat, ආදිය
ජෝන් මොන්ට්ගොමරි

3

මෙය අසීමිත ලෙස පෙනෙන දාර ගණන අල්ලා ගන්නා බව පෙනේ:

function isNumber(x, noStr) {
    /*

        - Returns true if x is either a finite number type or a string containing only a number
        - If empty string supplied, fall back to explicit false
        - Pass true for noStr to return false when typeof x is "string", off by default

        isNumber(); // false
        isNumber([]); // false
        isNumber([1]); // false
        isNumber([1,2]); // false
        isNumber(''); // false
        isNumber(null); // false
        isNumber({}); // false
        isNumber(true); // false
        isNumber('true'); // false
        isNumber('false'); // false
        isNumber('123asdf'); // false
        isNumber('123.asdf'); // false
        isNumber(undefined); // false
        isNumber(Number.POSITIVE_INFINITY); // false
        isNumber(Number.NEGATIVE_INFINITY); // false
        isNumber('Infinity'); // false
        isNumber('-Infinity'); // false
        isNumber(Number.NaN); // false
        isNumber(new Date('December 17, 1995 03:24:00')); // false
        isNumber(0); // true
        isNumber('0'); // true
        isNumber(123); // true
        isNumber(123.456); // true
        isNumber(-123.456); // true
        isNumber(-.123456); // true
        isNumber('123'); // true
        isNumber('123.456'); // true
        isNumber('.123'); // true
        isNumber(.123); // true
        isNumber(Number.MAX_SAFE_INTEGER); // true
        isNumber(Number.MAX_VALUE); // true
        isNumber(Number.MIN_VALUE); // true
        isNumber(new Number(123)); // true
    */

    return (
        (typeof x === 'number' || x instanceof Number || (!noStr && x && typeof x === 'string' && !isNaN(x))) &&
        isFinite(x)
    ) || false;
};

2

PFB වැඩ කරන විසඳුම:

 function(check){ 
    check = check + "";
    var isNumber =   check.trim().length>0? !isNaN(check):false;
    return isNumber;
    }

2

"සාදන ලද" විසඳුමක් සොයා ගැනීමට උත්සාහ කිරීමේ හිසරදය ඔබම ඉතිරි කරගන්න.

හොඳ පිළිතුරක් නොමැති අතර, මෙම ත්‍රෙඩ් එකේ විශාල ලෙස ඉහළට ඔසවා ඇති පිළිතුර වැරදිය.

npm install is-number

ජාවාස්ක්‍රිප්ට් හි, අගය සැමවිටම සංඛ්‍යාවක් දැයි විශ්වාසදායක ලෙස පරික්ෂා කිරීම තරම් සරල නොවේ. අංකයකට නූල් අගයක් දැමීම සඳහා devs +, -, හෝ Number () භාවිතා කිරීම සාමාන්‍ය දෙයකි (නිදසුනක් ලෙස, පරිශීලක ආදානය, රීජෙක්ස් ගැලපීම්, පාර්සර් ආදියෙන් අගයන් ආපසු ලබා දෙන විට). නමුත් අනපේක්ෂිත ප්‍රති results ල ලබා දෙන බොහෝ බුද්ධිමය නොවන අවස්ථා තිබේ:

console.log(+[]); //=> 0
console.log(+''); //=> 0
console.log(+'   '); //=> 0
console.log(typeof NaN); //=> 'number'

2

මෙය ගොඩනගා ඇත්තේ පෙර පිළිතුරු සහ අදහස් කිහිපයක් මත ය. පහත දැක්වෙන්නේ සියළුම දාර අවස්ථා සහ තරමක් සංක්ෂිප්තව ආවරණය කරයි:

const isNumRegEx = /^-?(\d*\.)?\d+$/;

function isNumeric(n, allowScientificNotation = false) {
    return allowScientificNotation ? 
                !Number.isNaN(parseFloat(n)) && Number.isFinite(n) :
                isNumRegEx.test(n);
}

1

විචල්‍යයක් වලංගු අංකයක් බව සහතික කිරීමට ක්‍රම ගැන මම මෑතකදී ලිපියක් ලිව්වෙමි : https://github.com/jehugaleahsa/artifacts/blob/master/2018/typescript_num_hack.md පාවෙන ලක්ෂ්‍යය හෝ නිඛිලය සහතික කරන්නේ කෙසේදැයි ලිපිය පැහැදිලි කරයි. වැදගත් ( +xඑදිරිව~~x ).

ලිපිය උපකල්පනය කරන්නේ විචල්‍යය ආරම්භ කිරීමට a stringහෝ a වන numberඅතර trimඑය ලබා ගත හැකි / බහුපද කර ඇති බවයි. වෙනත් වර්ග හැසිරවීමට එය දිගු කිරීම අපහසු නොවනු ඇත. මෙන්න එහි මස්:

// Check for a valid float
if (x == null
    || ("" + x).trim() === ""
    || isNaN(+x)) {
    return false;  // not a float
}

// Check for a valid integer
if (x == null
    || ("" + x).trim() === ""
    || ~~x !== +x) {
    return false;  // not an integer
}

1

තරමක් අවුල් සහගත මගේ උත්සාහය, හොඳම විසඳුම නොවේ

function isInt(a){
    return a === ""+~~a
}


console.log(isInt('abcd'));         // false
console.log(isInt('123a'));         // false
console.log(isInt('1'));            // true
console.log(isInt('0'));            // true
console.log(isInt('-0'));           // false
console.log(isInt('01'));           // false
console.log(isInt('10'));           // true
console.log(isInt('-1234567890'));  // true
console.log(isInt(1234));           // false
console.log(isInt('123.4'));        // false
console.log(isInt(''));             // false

// other types then string returns false
console.log(isInt(5));              // false
console.log(isInt(undefined));      // false
console.log(isInt(null));           // false
console.log(isInt('0x1'));          // false
console.log(isInt(Infinity));       // false

(1) විද්‍යාත්මක අංකනය සහ (2) පදනම් නොවන -10 අංකනය වන ඔක්ටල් ( 042) සහ ෂඩාස්රාකාර ( 0x45f)
ඩොමි

සංඛ්‍යාත්මක අගයක් සෙවීමේ ප්‍රශ්නයට මෙය පිළිතුරු සපයන්නේ නැත.
ජෙරමි

0

මගේ යෙදුමේදී අපි ඉඩ දෙන්නේ az AZ සහ අක්ෂර 0-9 පමණි. 0xnn (0x10 වැනි) සමඟ ආරම්භ නොවන්නේ නම් " string % 1 === 0" භාවිතා කරමින් ඉහත පිළිතුර ක්‍රියාත්මක වන බව මට පෙනී ගියේය, එවිට අපට එය අවශ්‍ය නොවන විට එය සංඛ්‍යාත්මකව ලබා දෙනු ඇත. මගේ සංඛ්‍යාත්මක පරීක්‍ෂණයේ පහත දැක්වෙන සරල උගුල අපගේ විශේෂිත අවස්ථාවන්හි උපක්‍රමය කරන බව පෙනේ.

function isStringNumeric(str_input){   
    //concat a temporary 1 during the modulus to keep a beginning hex switch combination from messing us up   
    //very simple and as long as special characters (non a-z A-Z 0-9) are trapped it is fine   
    return '1'.concat(str_input) % 1 === 0;}

අවවාදයයි : මෙය ජාවාස්ක්‍රිප්ට් සහ ක්‍රියා පිටපතේ දීර් number කාලයක් තිස්සේ පැවති දෝෂයක් ගසාකෑමක් විය හැකිය [අංකය ("1" + the_string)% 1 === 0)], මට ඒ සඳහා කතා කළ නොහැක, නමුත් එය අපට අවශ්‍ය දේම වේ.


එය ජාවාස්ක්‍රිප්ට් හි දෝෂයක් වන්නේ ඇයි?
බර්ගි

පර්ල් හෝ සී හි සමාන විසඳුමක් සහිත එකම හැසිරීම මා දකින්නේ නැත, මම ජාවාස්ක්‍රිප්ට් හෝ ක්‍රියා පිටපත සඳහා ක්‍රමලේඛන භාෂා සංවර්ධකයෙකු නොවන බැවින් මා අත්විඳින හැසිරීම සැබවින්ම චේතනාන්විතද නැද්ද යන්න මම නොදනිමි.
rwheadon

හොඳයි, ජාවාස්ක්‍රිප්ට් යනු ව්‍යංග වර්ගයේ වාත්තු කිරීම පිළිබඳ තරමක් අලස ය, නමුත් එය ක්‍රියාත්මක වන ආකාරය ඔබට පහසුවෙන් තේරුම් ගත හැකි බව ඔබ දැනගත් පසු. ඔබ සංඛ්‍යා වලට නූල් දමමින් සිටී ( % 1ඒවා මත සංඛ්‍යාත්මක ක්‍රියාකාරිත්වය යෙදවීමෙන් ), එමඟින් එය නූල් හෙක්ස් හෝ පාවෙන වචනාර්ථයක් ලෙස අර්ථ දක්වනු ඇත.
බර්ගි

0

මගේ විසඳුම:

// returns true for positive ints; 
// no scientific notation, hexadecimals or floating point dots

var isPositiveInt = function(str) { 
   var result = true, chr;
   for (var i = 0, n = str.length; i < n; i++) {
       chr = str.charAt(i);
       if ((chr < "0" || chr > "9") && chr != ",") { //not digit or thousands separator
         result = false;
         break;
       };
       if (i == 0 && (chr == "0" || chr == ",")) {  //should not start with 0 or ,
         result = false;
         break;
       };
   };
   return result;
 };

ඔබට විශේෂ අවශ්‍යතාවන්ට සරිලන පරිදි ලූපය තුළ අමතර කොන්දේසි එකතු කළ හැකිය.


0

ප්‍රවාහ පුස්තකාලයා y වැනි ස්ථිතික, සංයුක්ත කාල පරික්ෂා කිරීම සඳහා ඔබට වර්ග භාවිතා කළ හැකිය . ඇත්ත වශයෙන්ම පරිශීලක ආදානය සඳහා අතිශයින් ප්‍රයෝජනවත් නොවේ.

// @flow

function acceptsNumber(value: number) {
  // ...
}

acceptsNumber(42);       // Works!
acceptsNumber(3.14);     // Works!
acceptsNumber(NaN);      // Works!
acceptsNumber(Infinity); // Works!
acceptsNumber("foo");    // Error!

0

sNumවලංගු සංඛ්‍යාත්මක අගයක් තිබේදැයි පරීක්ෂා කිරීමට මෙන්න එක් ලයිනර් ; එය විවිධාකාර යෙදවුම් සඳහා පරීක්ෂා කර ඇත:

!isNaN(+s.replace(/\s|\$/g, ''));  // returns True if numeric value
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.