Verificați dacă caracterul este un număr? (Programare, Javascript)

lisovaccaro a intrebat.

Trebuie să verific dacă justPrices[i].substr(commapos+2,1).

Șirul este ceva de genul: „blabla,120”

În acest caz ar trebui să verifice dacă „0” este un număr. Cum se poate face acest lucru?

Comentarii

  • posibil duplicat aici –  > Por cctan.
  • @cctan Nu este un duplicat. Acea întrebare se referă la verificarea unui șir de caractere, aceasta se referă la verificarea unui caracter. –  > Por jackocnr.
  • Posibil duplicat al validării numerelor zecimale în JavaScript – IsNumeric() –  > Por Stephan Weinhold.
23 răspunsuri
GregL

Ați putea folosi operatorii de comparație pentru a vedea dacă se află în intervalul de caractere numerice:

var c = justPrices[i].substr(commapos+2,1);
if (c >= '0' && c <= '9') {
    // it is a number
} else {
    // it isn't
}

Yaron U.

puteți utiliza fie parseInt și apoi să verifici cu isNaN

fie, dacă doriți să lucrați direct pe șirul de caractere, puteți utiliza regexp, astfel:

function is_numeric(str){
    return /^d+$/.test(str);
}

Comentarii

  • Sau chiar mai simplu, dacă trebuie să verificăm un singur caracter: function is_numeric_char(c) { return /d/.test(c); } –  > Por jackocnr.
  • @jackocnr testul tău va returna true și pentru șirurile care conțin mai mult de un singur caracter (de ex. is_numeric_char("foo1bar") == true). dacă doriți să verificați dacă există un caracter numeric /^d$/.test(c) ar fi o soluție mai bună. dar oricum, nu asta era întrebarea 🙂 –  > Por Yaron U..
jackocnr

EDIT: Răspunsul actualizat de Blender este răspunsul corect aici dacă verificați doar un singur caracter (și anume !isNaN(parseInt(c, 10))). Răspunsul meu de mai jos este o soluție bună dacă doriți să testați șiruri întregi.

Aici este răspunsul jQuery isNumeric (în JavaScript pur), care funcționează cu șiruri întregi:

function isNumeric(s) {
    return !isNaN(s - parseFloat(s));
}

Comentariul pentru această funcție sună astfel:

// parseFloat NaNs numeric-cast falsuri pozitive (null|true|false|””)
// …dar interpretează greșit șirurile de numere principale, în special literalele hexazecimale („0x…”)
// scăderea forțează infiniturile la NaN

Cred că putem avea încredere în faptul că acești indivizi au petrecut destul de mult timp pe acest subiect!

Sursa comentată aici. Discuție super tocilară aici.

Comentarii

  • Acest lucru funcționează, dar este o suprasolicitare pentru verificarea numai a cifrelor (funcționează cu numere cu mai multe cifre). Soluția mea s-ar putea să nu fie la fel de clară, dar este mult mai rapidă decât aceasta. –  > Por utilizator2486570.
Marian

Mă întreb de ce nu a postat nimeni o soluție de genul:

var charCodeZero = "0".charCodeAt(0);
var charCodeNine = "9".charCodeAt(0);

function isDigitCode(n) {
   return(n >= charCodeZero && n <= charCodeNine);
}

cu o invocare de genul::

if (isDigitCode(justPrices[i].charCodeAt(commapos+2))) {
    ... // digit
} else {
    ... // not a digit
}

Comentarii

  • a căutat exact acest tip de soluție – ty –  > Por Matthias Herrmann.
  • Poți renunța la valoarea parametrului 0 pentru charCodeAt, deoarece 0 este implicită atunci când parametrul nu este furnizat. –  > Por Dave de Jong.
João Pimentel Ferreira

Funcție simplă

function isCharNumber(c) {
  return c >= '0' && c <= '9';
}

user2486570

Puteți utiliza acest lucru:

function isDigit(n) {
    return Boolean([true, true, true, true, true, true, true, true, true, true][n]);
}

Aici, am comparat-o cu metoda acceptată: http://jsperf.com/isdigittest/5 . Nu mă așteptam la mare lucru, așa că am fost destul de surprins, când am aflat că metoda acceptată era mult mai lentă.

Interesant este faptul că, în timp ce metoda acceptată este mai rapidă pentru introducerea corectă (de exemplu, „5”) și mai lentă pentru cea incorectă (de exemplu, „a”), metoda mea este exact opusă (rapidă pentru cea incorectă și mai lentă pentru cea corectă).

Cu toate acestea, în cel mai rău caz, metoda mea este de 2 ori mai rapidă decât soluția acceptată pentru intrări corecte și de peste 5 ori mai rapidă pentru intrări incorecte.

Comentarii

  • Îmi place acest răspuns! Poate îl optimizați la: !!([!0, !0, !0, !0, !0, !0, !0, !0, !0, !0][n]); Are un mare potențial WTF și funcționează destul de bine (eșuează pentru 007). –  > Por Jonathan.
  • @Jonathan – vezi răspunsul meu, metoda #4 –  > Por vsync.
  • În conformitate cu această „soluție”, "length" (și alte atribute găsite pe array-uri) sunt cifre 😛 –  > Por Shadow.
vsync

Cred că este foarte amuzant să găsim modalități de rezolvare a acestei probleme. Mai jos sunt câteva.
(Toate funcțiile de mai jos presupun argumentul este un singur caracter. Schimbați în n[0] pentru a o impune)

Metoda 1:

function isCharDigit(n){
  return !!n.trim() && n > -1;
}

Metoda 2:

function isCharDigit(n){
  return !!n.trim() && n*0==0;
}

Metoda 3:

function isCharDigit(n){
  return !!n.trim() && !!Number(n+.1); // "+.1' to make it work with "." and "0" Chars
}

Metoda 4:

var isCharDigit = (function(){
  var a = [1,1,1,1,1,1,1,1,1,1];
  return function(n){
    return !!a[n] // check if `a` Array has anything in index 'n'. Cast result to boolean
  }
})();

Metoda 5:

function isCharDigit(n){
  return !!n.trim() && !isNaN(+n);
}

Șirul de testare:

var str = ' 90ABcd#?:.+', char;
for( char of str ) 
  console.log( char, isCharDigit(char) );

Comentarii

  • Metodele 1, 2, 3 și 5: ieșire true pentru " ". –  > Por user247702.
  • Pentru distracție am făcut un jsperf al acestora, apoi am adăugat un charCodeAt() comparație – care a fost aproape de 4 ori mai rapidă – jsperf.com/isdigit3 –  > Por Rycochet.
  • @Rycochet – bună asta. Gama de coduri ASCII este într-adevăr cel mai bun mod de a testa… –  > Por vsync.
Vladyslav Beziazyzychenko

Cea mai scurtă soluție este:

const isCharDigit = n => n < 10;

Puteți aplica și acestea:

const isCharDigit = n => Boolean(++n);

const isCharDigit = n => '/' < n && n < ':';

const isCharDigit = n => !!++n;

dacă doriți să verificați mai mult de 1 caracter, puteți folosi următoarele variante

Expresie regulată:

const isDigit = n => /d+/.test(n);

Comparație:

const isDigit = n => +n == n;

Verificați dacă nu este NaN

const isDigit = n => !isNaN(n);

Comentarii

  • Prima pare să fie greșită, n<10 va returna true pentru caracterul spațiu, de exemplu. –  > Por Michael.
  • Boolean(++n) returnează, de asemenea, true pentru caracterul spațiu. –  > Por Michael.
RobG

Dacă testați caractere unice, atunci:

var isDigit = (function() {
    var re = /^d$/;
    return function(c) {
        return re.test(c);
    }
}());

va returna adevărat sau fals în funcție de faptul că c este sau nu o cifră.

zenslug

Vă sugerez un regex simplu.

Dacă căutați doar ultimul caracter din șir:

/^.*?[0-9]$/.test("blabla,120");  // true
/^.*?[0-9]$/.test("blabla,120a"); // false
/^.*?[0-9]$/.test("120");         // true
/^.*?[0-9]$/.test(120);           // true
/^.*?[0-9]$/.test(undefined);     // false
/^.*?[0-9]$/.test(-1);            // true
/^.*?[0-9]$/.test("-1");          // true
/^.*?[0-9]$/.test(false);         // false
/^.*?[0-9]$/.test(true);          // false

Iar regex-ul este și mai simplu dacă verificați doar un singur caracter ca intrare:

var char = "0";
/^[0-9]$/.test(char);             // true

mmm
var Is = {
    character: {
        number: (function() {
            // Only computed once
            var zero = "0".charCodeAt(0), nine = "9".charCodeAt(0);

            return function(c) {
                return (c = c.charCodeAt(0)) >= zero && c <= nine;
            }
        })()
    }
};

Banning Stuckey
isNumber = function(obj, strict) {
    var strict = strict === true ? true : false;
    if (strict) {
        return !isNaN(obj) && obj instanceof Number ? true : false;
    } else {
        return !isNaN(obj - parseFloat(obj));
    }
}

ieșire fără modul strict:

var num = 14;
var textnum = '14';
var text = 'yo';
var nan = NaN;

isNumber(num);
isNumber(textnum);
isNumber(text);
isNumber(nan);

true
true
false
false

ieșire cu modul strict:

var num = 14;
var textnum = '14';
var text = 'yo';
var nan = NaN;

isNumber(num, true);
isNumber(textnum, true);
isNumber(text, true);
isNumber(nan);

true
false
false
false

Insp

Încercați:

function is_numeric(str){
        try {
           return isFinite(str)
        }
        catch(err) {
            return false
        }
    }

cptdanko

Similar cu unul dintre răspunsurile de mai sus, am folosit

 var sum = 0; //some value
 let num = parseInt(val); //or just Number.parseInt
 if(!isNaN(num)) {
     sum += num;
 }

Această postare pe blog face mai multă lumină în acest sens verificați dacă un șir de caractere este numeric în Javascript | Typescript & ES6

Mhmdrz_A

O soluție simplă prin valorificarea verificării dinamice a tipului de limbaj:

function isNumber (string) {
   //it has whitespace
   if(string.trim() === ''){
     return false
   }
   return string - 0 === string * 1
}

a se vedea cazurile de test de mai jos

Matthew Layton

Acest lucru pare să funcționeze:

Legare statică:

String.isNumeric = function (value) {
    return !isNaN(String(value) * 1);
};

Prototip de legare:

String.prototype.isNumeric = function () {
    return !isNaN(this.valueOf() * 1);
};

Acesta va verifica caracterele unice, precum și șirurile întregi pentru a vedea dacă sunt numerice.

Lourayad
square = function(a) {
    if ((a * 0) == 0) {
        return a*a;
    } else {
        return "Enter a valid number.";
    }
}

Sursa

Alexander Serkin
function is_numeric(mixed_var) {
    return (typeof(mixed_var) === 'number' || typeof(mixed_var) === 'string') &&
        mixed_var !== '' && !isNaN(mixed_var);
}

Codul sursă

TheOne LuKcian

Puteți încerca acest lucru (a funcționat în cazul meu)

Dacă doriți să testați dacă primul caracter al unui șir de caractere este un int:

if (parseInt(YOUR_STRING.slice(0, 1))) {
    alert("first char is int")
} else {
    alert("first char is not int")
}

Dacă doriți să testați dacă primul caracter este un int:

if (parseInt(YOUR_CHAR)) {
    alert("first char is int")
} else {
    alert("first char is not int")
}

c7x43t

Această funcție funcționează pentru toate cazurile de testare pe care le-am putut găsi. este, de asemenea, mai rapidă decât:

function isNumeric (n) {
  if (!isNaN(parseFloat(n)) && isFinite(n) && !hasLeading0s(n)) {
    return true;
  }
  var _n = +n;
  return _n === Infinity || _n === -Infinity;
}

Comentarii

  • Am rezolvat cazul ‘0’. –  > Por c7x43t.
1234ru

Utilizați combinația de isNaN și parseInt funcții:

var character = ... ; // your character
var isDigit = ! isNaN( parseInt(character) );

O altă modalitate notabilă – înmulțirea cu unu (de genul character * 1 în loc de parseInt(character)) – face un număr nu numai din orice șir numeric, ci și dintr-un șir 0 din șirul gol și un șir care conține doar spații, deci nu este potrivit aici.

Stan S.

Iată o funcție simplă care face acest lucru.

function is_number(char) {{
    return !isNaN(parseInt(char));
}}

Returns:  true, false

Codare fericită!

Gibolt

Pur și simplu folosiți isFinite

const number = "1";
if (isFinite(number)) {
    // do something
}

Comentarii

  • Aceasta returnează true pentru un spațiu ” ” –  > Por Michael Bray.