# Validate a Number with Regular Expression

Validate a Number with Regular Expression

Many are asking me about this matter of how to properly validate a number using Regular Expression, so I decided to write this post to share with you from my experience and research. And most important thing that really bothers me, is that the internet is full of examples and solutions for exactly this task, but unfortunately most of them are incorrect or incomplete.

A number in computer science, can be represented in many ways, use cases and types. I will try to cover them all here.

# Regular Numbers

### Whole Positive

This number is usually called unsigned integer, but you can also call it a positive non-fractional number, include zero. This includes numbers like `0`, `1` and `99999`.
The Regular Expression that covers this validation is:

`/^(0|[1-9]\d*)\$/`

Test This Regex

### Whole Positive and Negative

This number is usually called signed integer, but you can also call it a non-fractional number. This includes numbers like `0`, `1`, `99999`, `-99999`, `-1` and `-0`.
The Regular Expression that covers this validation is:

`/^-?(0|[1-9]\d*)\$/ `

Test This Regex

As you probably noticed, I have also included `-0` as a valid number. But, some may argue with this usage, and tell that this is not a real number (you can read more about Signed Zero here). So, if you want to exclude this number from this regex, here’s what you should use instead:

`/^-?(0|[1-9]\d*)(?<!-0)\$/`

Test This Regex

All I have added is `(?<!-0)`, which means not to include `-0` before this assertion. This `(?<!...)` assertion called negative lookbehind, which means that any phrase replaces the `...` should not appear before this assertion. Lookbehind has limitations, like the phrase cannot include quantifiers. That’s why for some cases I’ll be using Lookahead instead, which is the same, but in the opposite way.

Many regex flavors, including those used by Perl and Python, only allow fixed-length strings. You can use literal text, character escapes, Unicode escapes other than `\X`, and character classes. You cannot use quantifiers or backreferences. You can use alternation, but only if all alternatives have the same length. These flavors evaluate lookbehind by first stepping back through the subject string for as many characters as the lookbehind needs, and then attempting the regex inside the lookbehind from left to right.

# Fractional Numbers

### Positive

This number is usually called unsigned float or unsigned double, but you can also call it a positive fractional number, include zero. This includes numbers like `0`, `1`, `0.0`, `0.1`, `1.0`, `99999.000001`, `5.10`.
The Regular Expression that covers this validation is:

`/^(0|[1-9]\d*)(\.\d+)?\$/`

Test This Regex

Some may say, that numbers like `.1`, `.0` and `.00651` (same as `0.1`, `0.0` and `0.00651` respectively) are also valid fractional numbers, and I cannot disagree with them. So here is a regex that additionally supports this format:

`/^(0|[1-9]\d*)?(\.\d+)?(?<=\d)\$/`

Test This Regex

### Negative and Positive

This number is usually called signed float or signed double, but you can also call it a fractional number. This includes numbers like `0`, `1`, `0.0`, `0.1`, `1.0`, `99999.000001`, `5.10`, `-0`, `-1`, `-0.0`, `-0.1`, `-99999.000001`, `5.10`.
The Regular Expression that covers this validation is:

`/^-?(0|[1-9]\d*)(\.\d+)?\$/`

Test This Regex

For non `-0` believers:

`/^(?!-0(\.0+)?\$)-?(0|[1-9]\d*)(\.\d+)?\$/`

Test This Regex

For those who want to support also the invisible zero representations, like `.1`, `-.1`, use the following regex:

`/^-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)\$/`

Test This Regex

The combination of non `-0` believers and invisible zero believers, use this regex:

`/^(?!-0?(\.0+)?\$)-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)\$/`

Test This Regex

# Numbers with a Scientific Notation (or Exponential Notation)

Some may want to support in their validations, numbers with a scientific character `e`, which is by the way, an absolutely valid number, it is created for shortly represent a very long numbers. You can read more about Scientific Notation here. These numbers are usually looks like `1e3` (which is `1000`), `1e-3` (which is `0.001`) and are fully supported by many major programming languages (e.g. JavaScript). You can test it by checking if the expression `'1e3'==1000` returns `true`.
I will divide the support for all the above sections, including numbers with scientific notation.

### Regular Numbers

Whole positive number regex validation, supports numbers like `6e4`, `16e-10`, `0e0` but also regular numbers like `0`, `11`:

`/^(0|[1-9]\d*)(e-?(0|[1-9]\d*))?\$/i`

Test This Regex

Whole positive and negative number regex validation, supports numbers like `-6e4`, `-16e-10`, `-0e0`but also regular numbers like `-0`, `-11` and all the whole positive numbers above:

`/^-?(0|[1-9]\d*)(e-?(0|[1-9]\d*))?\$/i `

Test This Regex

Whole positive and negative number regex validation for non `-0` believers, same as the above, except now it forbids numbers like `-0`, `-0e0`, `-0e5` and `-0e-6`:

`/^(?!-0)-?(0|[1-9]\d*)(e-?(0|[1-9]\d*))?\$/i`

Test This Regex

### Fractional Numbers

Positive number regex validation, supports also the whole numbers above, plus numbers like `0.1e3`, `56.0e-3`, `0.0e10` and `1.010e0`:

`/^(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?\$/i`

Test This Regex

Positive number with invisible zero support regex validation, supports also the above positive numbers, in addition numbers like `.1e3`, `.0e0`, `.0e-5` and `.1e-7`:

`/^(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?\$/i`

Test This Regex

Negative and positive number regex validation, supports the positive numbers above, but also numbers like `-0e3`, `-0.1e0`, `-56.0e-3` and `-0.0e10`:

`/^-?(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?\$/i`

Test This Regex

Negative and positive number regex validation fro non `-0` believers, same as the above, except now it forbids numbers like `-0`, `-0.00000`, `-0.0e0`, `-0.00000e5` and `-0e-6`:

`/^(?!-0(\.0+)?(e|\$))-?(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?\$/i`

Test This Regex

Negative and positive number with invisible zero support regex validation, supports also the above positive and negative numbers, in addition numbers like `-.1e3`, `-.0e0`, `-.0e-5` and `-.1e-7`:

`/^-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?\$/i`

Test This Regex

Negative and positive number with the combination of non `-0` believers and invisible zero believers, same as the above, but forbids numbers like `-.0e0`, `-.0000e15` and `-.0e-19`:

`/^(?!-0?(\.0+)?(e|\$))-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?\$/i`

Test This Regex

In many programming languages, string representation of hexadecimal number like `0x4F7A` may be easily cast to decimal number `20346`.
Thus, one may want to support it in his validation script.
The following Regular Expression supports only hexadecimal numbers representations:

`/^0x[0-9a-f]+\$/i`

Test This Regex

# All Permutations Together

These final Regular Expressions, support the invisible zero numbers.

### Signed Zero Believers

`/^(-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?|0x[0-9a-f]+)\$/i`

Test This Regex

### Non Signed Zero Believers

`/^((?!-0?(\.0+)?(e|\$))-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?|0x[0-9a-f]+)\$/i`

Test This Regex

Hope I covered all number permutations that are supported in many programming languages.
Good luck!

Those who want to validate a number that includes a thousand separator, you should clean all the commas (`,`) first, as there are different types of separators and positioning that mainly depends on the localization, so you can’t actually cover them all.
What I’m suggesting is to remove any separators first, just before the validation script. As an example:

```//JavaScript
function clearSeparators(number)
{
return number.replace(/,/g,'');
}```