A valid number can be split up into these components (in order):
A decimal number or an integer.
(Optional) An
'e'
or'E'
, followed by an integer.A decimal number can be split up into these components (in order):
(Optional) A sign character (either
'+'
or'-'
).One of the following formats:
At least one digit, followed by a dot
'.'
.At least one digit, followed by a dot
'.'
, followed by at least one digit.A dot
'.'
, followed by at least one digit.An integer can be split up into these components (in order):
(Optional) A sign character (either
'+'
or'-'
).At least one digit.
For example, all the following are valid numbers:
["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]
, while the following are not valid numbers:["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]
.Given a string
s
, returntrue
ifs
is a valid number.
Constriants
1 <= s.length <= 20
s
consists of only English letters (both uppercase and lowercase), digits (0-9
), plus'+'
, minus'-'
, or dot'.'
.
Difficulty
- Level: Hard
- Acceptance: 16.6%
Solution
Analysis
The hardest part for this problem would be setting up the regular expression. For starters, I identified that the +
and -
signs were optional and always in front. Hence, I added ^[\+\-]?
in front. The rest of the expression is based on identifying the different cases:
\d+
— Case for numbers with only digits\d+\.\d*(e[\+\-]?)?\d+
— Case for numbers such as1.5e+6
,1.e+7
…\d\.\d*
— Case for numbers such as1.234
\d+(e[\+\-]?)?\d+
— Case for numbers such as123e+7
,12e7
…\.\d+
— Case for numbers with digits after a.
\.\d+(e[\+\-]?)?\d+
— Case for numbers such as.123e-7
,.456e8
…
Finally, using the test
method for RegExp
, it will return a true
or false
value based on a match.