Як праверыць, ці з'яўляецца радок натуральны лік?

У JavaScript, як вы можаце праверыць, ці з'яўляецца радок натуральнага ліку (уключаючы нулі)?

дзякуй

прыклады:

'0'//ok
'1'//ok
'-1'//not ok
'-1.1'//not ok
'1.1'//not ok
'abc'//not ok
11
Што наконт 1.0 ? Гэта натуральны лік па вашаму вызначэнні?
дададзена аўтар Blender, крыніца
@kush: Некаторыя людзі ўключаюць 0 . Іншыя гэтага не робяць.
дададзена аўтар Blender, крыніца
дададзена аўтар Harsha Venkatram, крыніца
@kush: ParseInt? Ці ёсць зрабіць праверку?
дададзена аўтар Harsha Venkatram, крыніца
@Pointy: Менавіта мой пункт
дададзена аўтар Harsha Venkatram, крыніца
Праблема з ParseInt()parseFloat() ) з'яўляецца тое, што яны прымаюць смецце пасля лічбавай вядучай радкі, так ParseInt ( "15bananas") </код > з'яўляецца 15 , а не памылка.
дададзена аўтар Pointy, крыніца
@kush Wikipedia (і адзін з маіх прафесараў каледжа з маіх дзён каледжа) кажа, што натуральныя лікі могуць ці можа не ўключаць 0 , і заўсёды выключыць адмоўныя лікі. У выпадку ФП, у жаданае вызначэнне адзначаецца, што з улікам 0 (які на самай справе «неадмоўныя цэлыя лікі»). Акрамя таго, ParseInt у адзіночку не будзе працаваць, так як ParseInt ( '1.1') будзе вяртаць 1 (прынамсі, у Chrome).
дададзена аўтар ajp15243, крыніца
Існуюць не толькі натуральныя лікі неадмоўныя цэлыя лікі? Паспрабуйце ParseInt </а>? ParseInt на Mozilla Network Developer
дададзена аўтар kush, крыніца

13 адказы

Вось маё рашэнне:

function isNaturalNumber(n) {
    n = n.toString();//force the value incase it is not
    var n1 = Math.abs(n),
        n2 = parseInt(n, 10);
    return !isNaN(n1) && n2 === n1 && n1.toString() === n;
}

Вось дэма:

var tests = [
        '0',
        '1',
        '-1',
        '-1.1',
        '1.1',
        '12abc123',
        '+42',
        '0xFF',
        '5e3'
    ];

function isNaturalNumber(n) {
    n = n.toString();//force the value incase it is not
    var n1 = Math.abs(n),
        n2 = parseInt(n, 10);
    return !isNaN(n1) && n2 === n1 && n1.toString() === n;
}

console.log(tests.map(isNaturalNumber));

вось вынік:

<�Р> [праўда, ісціна, хлусня, хлусня, хлусня, хлусня, хлусня, хлусня, хлусня] </р>

DEMO: http://jsfiddle.net/rlemon/zN6j3/1

Заўвага: гэта не з'яўляецца сапраўдным натуральным лікам, але я зразумеў, што АП не патрэбен сапраўдны натуральны лік. Вось рашэнне для рэальных натуральных лікаў:

function nat(n) {
    return n >= 0 && Math.floor(n) === +n;
}

http://jsfiddle.net/KJcKJ/

provided by @BenjaminGruenbaum

19
дададзена
@Blender Шчыра кажучы, я б проста зрабіць п> = 0 && Math.floor (п) === + п , гэта тое, што я лічу натуральныя лікі :) Гэта коратка, і яна ахоплівае ўсе крайнія выпадкі наўмысна
дададзена аўтар Benjamin Gruenbaum, крыніца
Вось скрыпка jsfiddle.net/KJcKJ
дададзена аўтар Benjamin Gruenbaum, крыніца
+1 Гэта не можа «самы элегантны», але гэта толькі адзін тут працуе.
дададзена аўтар Benjamin Gruenbaum, крыніца
Але 5E3 і 0xFF <�я> з'яўляюцца натуральныя лікі. Яны проста розныя ўяўленні натуральных лікаў.
дададзена аўтар Dancrumb, крыніца
@rlemon - можа быць, я прапусціў гэта патрабаванне ... Я не магу знайсці, дзе ён кажа, што.
дададзена аўтар Dancrumb, крыніца
@BenjaminGruenbaum: Гэй, мой таксама працуе;)
дададзена аўтар Blender, крыніца
@rlemon: Вы павінны выправіць n1.toString.length === ...
дададзена аўтар Blender, крыніца
@rlemon: Вы забыліся Невялікі ключавое слова перад n2 . Без гэтага, вы робіце n2 глабальным.
дададзена аўтар Blender, крыніца
@Blender, я думаў, што я зрабіў (была памылка друку). Падобна на тое, рэдагаванне не было прынята. Дзякуй.
дададзена аўтар rlemon, крыніца
@BenjaminGruenbaum у той час як ваш з'яўляецца больш дакладным, да таго, што натуральны лік на самай справе, я не думаю, што яна будзе задавальняць патрабаванням OPS. Але зноў жа, можа быць, гэта будзе і АП не ведае гэтага?
дададзена аўтар rlemon, крыніца
Акрамя таго, ён не прыходзіла мне ў галаву, што я быў залішнім з .ToString (). Даўжыні і праверкі .Length. Гэта таксама будзе скарэктавана.
дададзена аўтар rlemon, крыніца
Blender, глядзіце коску пасля n1 дэкларацыі. П2 не з'яўляецца глабальным.
дададзена аўтар rlemon, крыніца
Я абнаўляю гэта: здаецца, што гэта не будзе працаваць на «+42». Рашэнне не самае вытанчанае, але працуе.
дададзена аўтар rlemon, крыніца
Ня @Dancrumb Ні я магу, я абнавіў свой адказ адпаведна. Я думаю, што дыскусіі ў каментарах, магчыма, збянтэжыла мяне крыху ад патрабаванняў. У любым выпадку ОП ведае перасцярога маёй функцыі і мае альтэрнатыву.
дададзена аўтар rlemon, крыніца
Мне здавалася, што ОП не жадаю, каб прайсці. Я заўважыў вышэй, што гэта вядома і @ скрыпка BenjaminGruenbaum з'яўляецца правільнай для праверкі натуральнага ліку. OP, верагодна разбор некаторых карыстацкі ўводу. Як уяўляецца, аднак ён да гэтага часу не пракаментаваць яго фактычнага намеры. Я буду абнаўляць, калі гэта не так. (Галочка прымушае мяне думаць, што ён хоча, каб гэтыя паводзіны)
дададзена аўтар rlemon, крыніца
Не ведаю, як гэта ўплывае на выкарыстанне на ОР, але гэты адказ паведамляе любую радок з вядучымі нулямі, напрыклад, 000 або 0023, а не натуральным.
дададзена аўтар HBP, крыніца
Даволі крута, але вось невялікі пытанне. <�Код> +42 <�я> з'яўляецца натуральны лік, але функцыя прымае значэнне хлусня пры перадачы +42 .
дададзена аўтар Octavian Damiean, крыніца
@rlemon: isNaturalNumber (не вызначана) і isNaturalNumber (нуль) разаб'е, а фіз (нуль) памылкова вяртае ісціну. <�Код> нац (не вызначана) правільна вяртае хлусня.
дададзена аўтар Ron Martinez, крыніца

Use a regular expression

function isNaturalNumber (str) {
    var pattern = /^(0|([1-9]\d*))$/;
    return pattern.test(str);
}

Функцыя будзе вяртаць True або </ілжывы код>, так што вы можаце зрабіць чэк, заснаваны на гэтым.

if(isNaturalNumber(number)){ 
  //Do something if the number is natural
}else{
  //Do something if it's not natural
}

Source: http://www.codingforums.com/showthread.php?t=148668

8
дададзена
не працуе +42 або 5E3 або 0xFF ці ... Карацей кажучы: лік больш, чым тэкст для разбору
дададзена аўтар Jan Turoň, крыніца
Так, і гэта не трэба, так як гэта не патрабаванні ор ст.
дададзена аўтар Chris Bier, крыніца
Я прадастаўленне адказу на аснове відавочных патрэбаў ОП, я не абавязаны задаволіць нічога далей. Я жадаю, каб захаваць яго простым і кропку. Калі вы адчуваеце, што мой адказ недастатковы, то калі ласка, напішыце адказ.
дададзена аўтар Chris Bier, крыніца
@ChrisB Вядома, гэта робіць. Гэтыя значэння задавальняюць натуральны лік. Вы павінны не толькі код для прыкладаў
дададзена аўтар Ian, крыніца
Адказ заснаваны на <�я> некаторыя з патрэб ОП. Тое, як людзі паказваюць, што яны адчуваюць адказ недастатковы гэта з downvotes, што я бег галасоў на сёння. Свае словы, я не абавязаны задаволіць нічога далей, напрыклад, як мой уласны адказ
дададзена аўтар Ian, крыніца
Oneliner: /^\d+$/.test(number)
дададзена аўтар Kamil Kiełczewski, крыніца

Калі ў вас ёсць рэгулярны выраз фобіі, вы маглі б зрабіць нешта накшталт гэтага:

function is_natural(s) {
    var n = parseInt(s, 10);

    return n >= 0 && n.toString() === s;
}

І некаторыя тэсты:

> is_natural('2')
true
> is_natural('2x')
false
> is_natural('2.0')
false
> is_natural('NaN')
false
> is_natural('0')
true
> is_natural(' 2')
false
6
дададзена
@ Ajp15243: Ці можаце вы растлумачыць, як 1,0 адрозніваецца ад 1 ?
дададзена аўтар Blender, крыніца
@ Ajp15243: Чаму гэта не натуральны лік? Гэта як цэлае і больш 0/1 (у залежнасці ад таго, як вы вызначаеце мноства натуральных лікаў).
дададзена аўтар Blender, крыніца
@Pointy: Ну, <�я> можна </я> даказаць, што 2 з наступнай бясконцай чарадой нулёў пасля коскі з'яўляецца лік 2, гэтак жа, як 1, пасля бясконцай чарады 9 пасля дзесятковай кропкі таксама 2 ,
дададзена аўтар Blender, крыніца
@ Ajp15243: Дзесятковы кропка не змяняе аб'ект, які 1.0 спасылаецца. Да таго ж вызначэнне, што вы сцвярджаеце, што 1,0 і 1,00 не роўныя? Некалькі звязаных (і, верагодна, мацней) доказ будзе паказваць, што 0,999 ... = 1 , які мае доўгая артыкул Вікіпедыі .
дададзена аўтар Blender, крыніца
Гэта мяне дзівіць, як шмат людзей не уключаючы параметр натальной
дададзена аўтар Ian, крыніца
Калі 2,0 з'яўляецца ці не з'яўляецца натуральным лікам цікавы філасофскае пытанне :-) (Ці можа лік быць сапраўды роўны натуральнаму ліку, але яшчэ не <�я> быць натуральны лік ? Я не матэматык.)
дададзена аўтар Pointy, крыніца
@Blender я на самой справе толькі што прачытаў ваш каментар, што цэлыя лікі ўяўляюць сабой падмноства рацыянальных лікаў. Я думаю, што гэта простае вызначэнне, якое я не мог думаць аб тым, што звязвае іх разам для мяне, так што адсюль вынікае, што 1,0 з'яўляецца цэлым лікам і таму натуральны лік.
дададзена аўтар ajp15243, крыніца
@Blender Таксама добрыя моманты! Дзякуй за тлумачэнне.
дададзена аўтар ajp15243, крыніца
@Blender Таму што ён мае .0 . Так, 1,0 === 1 , але 1,0 можна разглядаць як іншы "сутнасці» (за адсутнасцю лепшага слова), чым 1 з-за яго дзесятковай складнікам. Я проста кажу, што мне цікава бачыць фармальнае і афіцыйнае вызначэнне для цэлага з удзелам .0 выпадак, ці, па меншай меры, вызначэнне растлумачыць, што 1.0 робіць або робіць <�я> не адрозніваецца ад 1 у якасці «асобы» з-за або нягледзячы на ​​дзесятковую кампанента. У асноўным я хачу фармальны адказ на філасофскае пытанне завостраны ст. Я мяркую, што гэта таксама атрымлівае ўніз, калі роўнасць азначае, што яны такія жа «твар», улічваючы ваш каментар на яго пытанне.
дададзена аўтар ajp15243, крыніца
@Blender Я не ўпэўнены, што гэта па сутнасці цэлае. Я адкрыты бачыць доказ.
дададзена аўтар ajp15243, крыніца

Вы можаце выкарыстоўваць

var inN = !!(+v === Math.abs(~~v) && v.length);

Апошняе выпрабаванне гарантуе '' дае </ілжывы код>.

Звярніце ўвагу, што гэта не будзе працаваць з вельмі вялікімі лікамі (напрыклад, 1e14 )

2
дададзена
@dystroy: 12balloons не з'яўляецца натуральным лікам, так што я б выказаць здагадку, што функцыя будзе вяртаць </ілжывы код> для яго.
дададзена аўтар Blender, крыніца
OK, адрэдагаваныя для «12balloons» рэч, я спадзяюся, што ОП не бачыць рэчы, як аўтары ParseInt ...
дададзена аўтар Denys Séguret, крыніца
@ Ajp15243 Ну, цалкам верагодна, так, але мой код вяртае хлусня для ABC .
дададзена аўтар Denys Séguret, крыніца
OP не кажа, што ён хоча зрабіць з «12balloons».
дададзена аўтар Denys Séguret, крыніца
Ну parseFloat() і ParseInt() абодва прымаюць смецце ў канцы лікавы часткі радка, таму parseFloat ( "12balloons") вяртае 12 .
дададзена аўтар Pointy, крыніца
Гэта, верагодна, варта лічыць, што 12balloons таксама патэнцыял, калі няправільны ўвод, так як OP дае «ABC» як «не ў парадку». Напрыклад,
дададзена аўтар ajp15243, крыніца
Вы маглі б выкарыстаць: isFinite (е) && Math.abs (Math.round (е)) == е
дададзена аўтар pdjota, крыніца

You can do if(num.match(/^\d+$/)){ alert(num) }

2
дададзена
няма, вы не можаце (гл каментар у ChrisB адказ)
дададзена аўтар Jan Turoň, крыніца
function isNatural(num){
    var intNum = parseInt(num);
    var floatNum = parseFloat(num);
    return (intNum == floatNum) && intNum >=0;
}
1
дададзена
<�Код> 2 == 2,0 , так што ваша функцыя будзе вяртаць True для '2.0' .
дададзена аўтар Blender, крыніца
@Ian: 2,0 === 2 , як у JS і ў матэматычным сэнсе.
дададзена аўтар Blender, крыніца
@Ian: Цэлыя падмноства рацыянальных лікаў. <�Код> 1.0 і 1 ставяцца да аднаго аб'екту, гэтак жа, як 0 і 0,0 абодва ставяцца да 0 .
дададзена аўтар Blender, крыніца
@Blender Так як я бачыў спасылкі на Вікіпедыю, я мог бы таксама выкарыстоўваць яго. Гэта сведчыць натуральныя лікі з'яўляюцца неадмоўнага цэлымі лікамі. Гэта сведчыць цэлыя лікі з'яўляюцца «лік, якое можна запісаць без дробавай ці дзесятковай складнікам». Так што я думаю, 2,0 лічыцца цэлым лікам, таму што <�я> можна </я> быць напісаная без дзесятковай кропкі. Я быў больш-менш спрабую ўбачыць, калі чалавек быў аргумент супраць яго, замест таго, каб узяць на сябе (і не забяспечвае тлумачэнне ў сваім адказе)
дададзена аўтар Ian, крыніца
@Blender Прастола, нам проста трэба нейкае тлумачэнне дзіўна спрэчнае пытанне. Гэта, здаецца, мае сэнс, я проста не думаў пра гэта, што шлях
дададзена аўтар Ian, крыніца
@Blender схлусіў я. Не 1,0 лічыцца рацыянальным лікам? Проста таму, што 1,0 === 1 у JS не азначае, што гэта праўда, у вызначэннях матэматыкі
дададзена аўтар Ian, крыніца
@ Ajp15243 Абсалютна, але ў той жа час, паглядзіце на мой каментар прама перад гэтым у адносінах да Blender. Можа быць, гэта павінна быць справядліва. Але вы маеце рацыю, гэта залежыць ад таго, наколькі строгія ОП «хоча», каб гэта было
дададзена аўтар Ian, крыніца
@ Ajp15243 2.0 не з'яўляецца цэлым лікам, такім чынам, не з'яўляецца натуральным лікам
дададзена аўтар Ian, крыніца
@Ian Наколькі адказы ідуць, ды гэта, безумоўна, да АП. Для матэматычных азначэнняў, на якіх вялікая частка гэтых адказаў/камэнтароў/абмеркаванняў заснавана, мне цікава ведаць, калі лік, напрыклад 2,0 лічыцца фактычны лік, або проста эквівалентна цэламу ліку, якое з'яўляецца " асобны нумар суб'ект ». Я мяркую, ёсць рознагалоссе ў матэматычным свеце. Можа быць, пытанне math.stackexchange.com .
дададзена аўтар ajp15243, крыніца
@Ian Праўда, забыўся, што падрабязна ў вызначэнне натуральнага ліку таму я прызнаю, што кропка. OP, верагодна, варта зрабіць ясна, ці з'яўляецца цэлы лік, эквівалентнае колькасць ўключаны, то (я мяркую, не так як яны пазначаны натуральныя лікі, але яны, магчыма, не думаў пра гэта).
дададзена аўтар ajp15243, крыніца
@Blender Можна было б сцвярджаць, што 2.0 павінен быць сапраўдным з-за самога факту, што 2 == 2.0 . Залежыць ад таго, што ОП хоча.
дададзена аўтар ajp15243, крыніца
function isNatural(n){
    return Math.abs(parseInt(+n)) -n === 0;
}

Гэта вяртае хлусня для «1» сабак, «-1», «» або «1.1», і вяртае ісціну

для неадмо ¢ ных цэлых лікаў або іх паслядоўнасцяў, у тым ліку «1.2345e12», і <�моцны> не '1.2345e3.

1
дададзена

Вы можаце праверыць міжнар з рэгулярным выразам:

var intRegex = /^\d+$/;
if(intRegex.test(someNumber)) {
alert('Natural');
}
1
дададзена

Колькасць() точно аналізуе ўваходны радка. ( "12basdf" з'яўляецца NaN, "+42" 42 і г.д.). Выкарыстоўвайце гэта, каб праверыць і паглядзець, калі гэта лік наогул. Адтуль, проста зрабіць пару праверак, каб пераканацца, што ўваход адпавядае астатняму вашым крытэрам.

function isNatural(n) {
    if(/\./.test(n)) return false; //delete this line if you want n.0 to be true
    var num = Number(n);
    if(!num && num !== 0) return false;
    if(num < 0) return false;
    if(num != parseInt(num)) return false; //checks for any decimal digits
    return true;
}
1
дададзена

Выкарыстоўвайце /^ \ d + $/ будзе адпавядаць 000 . таму выкарыстоўвайце /^ [1-9] \ d * $ | ^ 0 $/ матч цэлае станоўчае лік або 0 будзе правільным.

1
дададзена

Пераўтварыць радок у лік, а затым праверыць:

function isNatural( s ) {
  var n = +s;
  return !isNaN(n) && n >= 0 && n === Math.floor(n);
}
0
дададзена
У прыкладзе 1.1 «не ў парадку»
дададзена аўтар James Montagne, крыніца
@JamesMontagne адказ быў адрэдагаваны :-)
дададзена аўтар Pointy, крыніца
function isNatural(number){
    var regex=/^\d*$/;
    return regex.test( number );
}
0
дададзена

Я ведаю, што гэтая нітка трохі старая, але я лічу, што я знайшоў найбольш дакладнае рашэнне да гэтага часу:

function isNat(n) {               //A natural number is...
  return n != null                //...a defined value,
      && n >= 0                   //...nonnegative,
      && n != Infinity            //...finite,
      && typeof n !== 'boolean'   //...not a boolean,
      && !(n instanceof Array)    //...not an array,
      && !(n instanceof Date)     //...not a date,
      && Math.floor(n) === +n;    //...and whole.
}

Маё рашэнне ў асноўным эвалюцыя ўкладу @BenjaminGruenbaum.

Каб стварыць рэзервовую копію майго патрабаванне дакладнасці я значна пашырыў на тэсты, якія @rlemon зробленыя і пакласці ўсе прапанаваныя рашэнні, уключаючы маё ўласнае праз іх:

http://jsfiddle.net/icylace/qY3FS/1/

Як і чакалася, некаторыя рашэнні з'яўляюцца больш дакладнымі, чым іншыя, але ў мяне гэта толькі адзін, які праходзіць усе тэсты.

EDIT: I updated isNat() to rely less on duck typing and thus should be even more reliable.

0
дададзена