274

My end goal is to validate an input field. The input may be either alphabetic or numeric.

1

18 Answers 18

510

If I'm not mistaken, the question requires "contains number", not "is number". So:

function hasNumber(myString) {
  return /\d/.test(myString);
}
Sign up to request clarification or add additional context in comments.

5 Comments

this solution doesn't take into account non-integer numbers like 3.2 or 1e4
It does. Check in console: hasNumber("check 3.2 or 1e4") = true vs hasNumber("check no numbers") = false. Because 3.2 and 1e4 contain numbers in itself.
Why is this answer not on the top?
I tried putting the /\d/ in "" - that was stupid, just writing this in case someone else makes the same mistake
More information about the RegExp .test method can be found here: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
130

You can do this using javascript. No need for Jquery or Regex

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

While implementing

var val = $('yourinputelement').val();
if(isNumeric(val)) { alert('number'); } 
else { alert('not number'); }

Update: To check if a string has numbers in them, you can use regular expressions to do that

var matches = val.match(/\d+/g);
if (matches != null) {
    alert('number');
}

11 Comments

matches != null means not undefined or null while matches !== null means specifically not null but passes undefined.
match() returns an array or null. So if (matches !== null) should be fine (and it will please JSHint.) Source: developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
It should be isFinite(parseFloat(n)) in the first example. isNumeric("5,000") fails.
@m.spyratos, Well, isFinite() gives true if the passed value is a finite number and number 5,000 is a formatted string of number not a finite number.
@Starx, I agree. But if you don't support formatted string as input, then why do you use parse float in isNaN? I would suggest to either remove parse float from isNaN or add it to isFinite as well to be consisted.
|
48

This is what you need.

      var hasNumber = /\d/;   
      hasNumber.test("ABC33SDF");  //true
      hasNumber.test("ABCSDF");  //false 

2 Comments

this is an excellent answer I can't believe i never knew about this! thanks for sharing
Awesome bro, can't believed on this before testing. Thanks be blessed bro
23
function validate(){    
    var re = /^[A-Za-z]+$/;
    if(re.test(document.getElementById("textboxID").value))
       alert('Valid Name.');
    else
       alert('Invalid Name.');      
}

1 Comment

I had to read the whole question to realize this actually answers the exact question asked. The question title is a little deceptive.
11

It's not bulletproof by any means, but it worked for my purposes and maybe it will help someone.

var value = $('input').val();
 if(parseInt(value)) {
  console.log(value+" is a number.");
 }
 else {
  console.log(value+" is NaN.");
 }

2 Comments

Boolean(parseInt(3)) -> true; Boolean(parseInt("3")) -> true; Boolean(parseInt("three")) -> false
Be careful while using this parseInt("0") will also be false
9

Using Regular Expressions with JavaScript. A regular expression is a special text string for describing a search pattern, which is written in the form of /pattern/modifiers where "pattern" is the regular expression itself, and "modifiers" are a series of characters indicating various options.
         The character class is the most basic regex concept after a literal match. It makes one small sequence of characters match a larger set of characters. For example, [A-Z] could stand for the upper case alphabet, and \d could mean any digit.

From below example

  • contains_alphaNumeric « It checks for string contains either letter or number (or) both letter and number. The hyphen (-) is ignored.
  • onlyMixOfAlphaNumeric « It checks for string contain both letters and numbers only of any sequence order.

Example:

function matchExpression( str ) {
    var rgularExp = {
        contains_alphaNumeric : /^(?!-)(?!.*-)[A-Za-z0-9-]+(?<!-)$/,
        containsNumber : /\d+/,
        containsAlphabet : /[a-zA-Z]/,

        onlyLetters : /^[A-Za-z]+$/,
        onlyNumbers : /^[0-9]+$/,
        onlyMixOfAlphaNumeric : /^([0-9]+[a-zA-Z]+|[a-zA-Z]+[0-9]+)[0-9a-zA-Z]*$/
    }

    var expMatch = {};
    expMatch.containsNumber = rgularExp.containsNumber.test(str);
    expMatch.containsAlphabet = rgularExp.containsAlphabet.test(str);
    expMatch.alphaNumeric = rgularExp.contains_alphaNumeric.test(str);

    expMatch.onlyNumbers = rgularExp.onlyNumbers.test(str);
    expMatch.onlyLetters = rgularExp.onlyLetters.test(str);
    expMatch.mixOfAlphaNumeric = rgularExp.onlyMixOfAlphaNumeric.test(str);

    return expMatch;
}

// HTML Element attribute's[id, name] with dynamic values.
var id1 = "Yash", id2="777", id3= "Yash777", id4= "Yash777Image4"
    id11= "image5.64", id22= "55-5.6", id33= "image_Yash", id44= "image-Yash"
    id12= "_-.";
console.log( "Only Letters:\n ", matchExpression(id1) );
console.log( "Only Numbers:\n ", matchExpression(id2) );
console.log( "Only Mix of Letters and Numbers:\n ", matchExpression(id3) );
console.log( "Only Mix of Letters and Numbers:\n ", matchExpression(id4) );

console.log( "Mixed with Special symbols" );
console.log( "Letters and Numbers :\n ", matchExpression(id11) );
console.log( "Numbers [-]:\n ", matchExpression(id22) );
console.log( "Letters :\n ", matchExpression(id33) );
console.log( "Letters [-]:\n ", matchExpression(id44) );

console.log( "Only Special symbols :\n ", matchExpression(id12) );

Out put:

Only Letters:
  {containsNumber: false, containsAlphabet: true, alphaNumeric: true, onlyNumbers: false, onlyLetters: true, mixOfAlphaNumeric: false}
Only Numbers:
  {containsNumber: true, containsAlphabet: false, alphaNumeric: true, onlyNumbers: true, onlyLetters: false, mixOfAlphaNumeric: false}
Only Mix of Letters and Numbers:
  {containsNumber: true, containsAlphabet: true, alphaNumeric: true, onlyNumbers: false, onlyLetters: false, mixOfAlphaNumeric: true}
Only Mix of Letters and Numbers:
  {containsNumber: true, containsAlphabet: true, alphaNumeric: true, onlyNumbers: false, onlyLetters: false, mixOfAlphaNumeric: true}
Mixed with Special symbols
Letters and Numbers :
  {containsNumber: true, containsAlphabet: true, alphaNumeric: false, onlyNumbers: false, onlyLetters: false, mixOfAlphaNumeric: false}
Numbers [-]:
  {containsNumber: true, containsAlphabet: false, alphaNumeric: false, onlyNumbers: false, onlyLetters: false, mixOfAlphaNumeric: false}
Letters :
  {containsNumber: false, containsAlphabet: true, alphaNumeric: false, onlyNumbers: false, onlyLetters: false, mixOfAlphaNumeric: false}
Letters [-]:
  {containsNumber: false, containsAlphabet: true, alphaNumeric: true, onlyNumbers: false, onlyLetters: false, mixOfAlphaNumeric: false}
Only Special symbols :
  {containsNumber: false, containsAlphabet: false, alphaNumeric: false, onlyNumbers: false, onlyLetters: false, mixOfAlphaNumeric: false}

java Pattern Matching with Regular Expressions.

Comments

6

You can do this using javascript. No need for Jquery or Regex

function isNumeric(n) 
{
  return !isNaN(n);
}

4 Comments

Overkill. Could be just function isNumeric(n) { return !isNaN(n); }
This also doesn't check to see if ANY character is a number. But I can think of a solution inspired by this.
This only checks if it is a number, not if it contains a number. "ABC123" would resolve to false, whereas it should resolve to true. Also why create an extra function instead of just if ( !isNaN(str) ) {} ?
Working in TS in following way if (!isNaN(n)) { ...... }
4

To test if any char is a number, without overkill❓, to be adapted as need.

const s = "EMA618"

function hasInt(me){
  let i = 1,a = me.split(""),b = "",c = "";
  a.forEach(function(e){
   if (!isNaN(e)){
     console.log(`CONTAIN NUMBER «${e}» AT POSITION ${a.indexOf(e)} => TOTAL COUNT ${i}`)
     c += e
     i++
   } else {b += e}
  })
  console.log(`STRING IS «${b}», NUMBER IS «${c}»`)
  if (i === 0){
    return false
    // return b
  } else {
    return true
    // return +c
  }
}


hasInt(s)

Comments

3

One way to check it is to loop through the string and return true (or false depending on what you want) when you hit a number.

function checkStringForNumbers(input){
    let str = String(input);
    for( let i = 0; i < str.length; i++){
              console.log(str.charAt(i));
        if(!isNaN(str.charAt(i))){           //if the string is a number, do the following
            return true;
        }
    }
}

Comments

1

parseInt provides integers when the string begins with the representation of an integer:

(parseInt '1a')  is  1

..so perhaps:

isInteger = (s)->
  s is (parseInt s).toString()  and  s isnt 'NaN'

(isInteger 'a') is false
(isInteger '1a') is false
(isInteger 'NaN') is false
(isInteger '-42') is true

Pardon my CoffeeScript.

1 Comment

Basically, parseInt('10m') /* returns 10*/ will do the trick if the string starts with a number. Otherwise returns NaN. If at all this behaviour is ok for you, consider parseFloat('2.34million') so you get 2.34 instead of losing money ;-)
1

I think it's simple and easy way to extract numbers and string.

str = "jdghj4874y6jfngvjbng"
let num = []
let strEx = []
for (i = 0; i < str.length; i++) {
  if (str[i] >= 0) {
    num.push(str[i])
  } else {
    strEx.push(str[i])
  }
}
console.log('nums:', JSON.stringify(num))
console.log('chars:', JSON.stringify(strEx))

1 Comment

I think there is no need to convert object into stringy Please put the reason Thank you
1
function check_string(str){
  const number_pattern = /\d/;
  return number_pattern.test(str)
}

let sample_string = "Hello World 1234";
let is_string_contains_number = check_string(sample_string);
//output : true [if the string contains number in it]

Comments

0

This code also helps in, "To Detect Numbers in Given String" when numbers found it stops its execution.

function hasDigitFind(_str_) {
  this._code_ = 10;  /*When empty string found*/
  var _strArray = [];

  if (_str_ !== '' || _str_ !== undefined || _str_ !== null) {
    _strArray = _str_.split('');
    for(var i = 0; i < _strArray.length; i++) {
      if(!isNaN(parseInt(_strArray[i]))) {
        this._code_ = -1;
        break;
      } else {
        this._code_ = 1;
      }
    }

  }
  return this._code_;
}

Comments

0

Below code checks for same number, sequence number and reverse number sequence.

function checkNumSequnce(arrayNM2) {
    inseqCounter=1;
    continousSeq = 1;
    decsequenceConter = 1;
    var isequence = true;
    for (i=0;i<arrayNM2.length-1;i++) {
      j=i+1;
      if (arrayNM2[i] == arrayNM2[i+1]) { 
                if(inseqCounter > 1 || decsequenceConter > 1){
                    isequence =  false; break;
                }        
                 continousSeq++; 
                             
         }         
        else if (arrayNM2[j]- arrayNM2[i] == 1) {
            if(decsequenceConter > 1 || continousSeq > 1){
                isequence =  false; break;  
              }      
             inseqCounter++;               
                        
        } else if(arrayNM2[i]- arrayNM2[j] == 1){
              if(inseqCounter > 1 || continousSeq > 1){
                   isequence =  false; break;
               }
              decsequenceConter++;
        }else{
              isequence= false;
              break;
        }
  };

  console.log("isequence: "+ isequence); 

  };

2 Comments

This is undoubtedly the most confusing and verbose SO solution I have ever seen
@kshitij This is answer is working for sequential and repeated number validation. May be this answer is not 100% match for this question. But great logic. Thanks
0

We can check it by using !/[^a-zA-Z]/.test(e)
Just run snippet and check.

function handleValueChange() {
  if (!/[^a-zA-Z]/.test(document.getElementById('textbox_id').value)) {
      var x = document.getElementById('result');
      x.innerHTML = 'String does not contain number';
  } else {
    var x = document.getElementById('result');
    x.innerHTML = 'String does contains number';
  }
}
input {
  padding: 5px;
}
<input type="text" id="textbox_id" placeholder="Enter string here..." oninput="handleValueChange()">
<p id="result"></p>

1 Comment

this doesn't work for input abc! - the regex you have checks if its not an alphabet; this means even symbols like ! will be treated as number.
0

Nobody has addressed the body of the question:

My end goal is to validate an input field. The input may be either alphabetic or numeric.

-- op

So here is a function that returns a boolean answer,
true if the passed input has a Number value OR a strictly alphabetic string value,
false otherwise:

const isAlphaOrNumeric = input => {
  if ('' === input.value.trim())
    return false // empty
    
  if (!Number.isNaN(Number(input.value)))
    return true //'number'

  return /^[a-zA-Z]+$/.test(input.value.trim()) // 'alphabetic'
}

const isAlphaOrNumeric = input => {
  if ('' === input.value.trim())
    return false

  if (!Number.isNaN(Number(input.value)))
    return true

  return /^[a-zA-Z]+$/.test(input.value.trim())
}

const f = document.querySelector('form')
const test = f.querySelector('[name="test"]')
const test2 = f.querySelector('[name="test2"]')
const test3 = f.querySelector('[name="test3"]')
f.onsubmit = e => {
  e.preventDefault()
  console.log(test.value, isAlphaOrNumeric(test))
  console.log(test2.value, isAlphaOrNumeric(test2))
  console.log(test3.value, isAlphaOrNumeric(test3))
}
<form>
  <input name="test" value="abc"><br>
  <input name="test2" value="-3.14"><br>
  <input name="test3" value="AFF4B3"><br>
  <button>
    check it
  </button>
</form>

Comments

0

Try this to check whether string has number or not.

'test123'.split('').reduce((result,ch) => ch.charCodeAt(0) >= 48 && ch.charCodeAt(0) <= 57), false);

Comments

-2

You can also try lodash:

const isNumeric = number => 
  _.isFinite(_.parseInt(number)) && !_.isNaN(_.parseInt(number))

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.