ddintzner
ddintzner

Reputation: 245

Javascript regular expression that matches only JavaScript-style numbers

I am trying to create a javascript regular expression that matches only valid Javascript-style numbers. More requirements include support for an optional minus or plus sign in front of the number, the decimal dot and exponent notations such as 1e-4 or 1E4, and again with an optional sign in front of the exponent.

The expression can accept digits in front or after the dot, but the number cannot be just a dot. Such as .2 and 2. are valid, but not just the dot.

Ideally the expression is contained in /^...$/; format.

I got a few of the items, but my expression should be able to pass valid javascript values such as .5, -.5 or +5

function validNumber(number) {
    var regexNum = /^-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?$/; 
    return regexNum.test(number);
}

console.log(validNumber("0.0001")); // true
console.log(validNumber("-5")); // true
console.log(validNumber("0.3425")); // true
console.log(validNumber("1e-4")); // true
console.log(validNumber("1E-4")); // true
console.log(validNumber("1Ee-4")); // false
console.log(validNumber("-4.34")); // true
console.log(validNumber("Test123")); // false
console.log(validNumber("+-2")); // false
console.log(validNumber("5.")); // true
console.log(validNumber(".")); // false
console.log(validNumber(".5")); // Should be true, but passes as false
console.log(validNumber("-.5")); // Should be true, but passes as false
console.log(validNumber("+5"));  // Should be true, but passes as false

Any suggestions?

Upvotes: 2

Views: 143

Answers (2)

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 626689

You may use

/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)(?:[eE][-+]?[0-9]+)?$/

See the regex demo

Details

  • ^ - start of string
  • [-+]? - an optional + or - sign
  • (?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?) - either of the two sequences:
    • \.[0-9]+ - a dot and 1+ digits
    • | - or
    • [0-9]+(?:\.[0-9]*)? - 1+ digits, then an optional sequence of a . followed with 0+ digits
  • (?:[eE][-+]?[0-9]+)? - an optional exponent part:
    • [eE] - an e or E
    • [-+]? - an optional plus or minus
    • [0-9]+ - 1 or more digits
  • $ - end of string.

var regexNum = /^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)(?:[eE][-+]?[0-9]+)?$/;

function validNumber(number) {
    return regexNum.test(number);
}

console.log("0.0001", validNumber("0.0001")); // true
console.log("-5", validNumber("-5")); // true
console.log("0.3425", validNumber("0.3425")); // true
console.log("1e-4", validNumber("1e-4")); // true
console.log("1E-4", validNumber("1E-4")); // true
console.log("1Ee-4", validNumber("1Ee-4")); // false
console.log("-4.34", validNumber("-4.34")); // true
console.log("Test123", validNumber("Test123")); // false
console.log("+-2", validNumber("+-2")); // false
console.log("5.", validNumber("5.")); // true
console.log(".", validNumber(".")); // false
console.log(".5", validNumber(".5")); // Should be true, but passes as false
console.log("-.5", validNumber("-.5")); // Should be true, but passes as false
console.log("+5", validNumber("+5"));  

Upvotes: 2

Pritom
Pritom

Reputation: 1333

Can you please check below regex?

var pattern = new RegExp("(^([-|+]?)([0-9]{0,12}?)(\.)([0-9]){0,12}$)|(^([-|+]?)([0-9]){0,12}$)");

Upvotes: 0

Related Questions