Validate if a given string is numeric. Examples:
Input : str = "11.5" Output : true Input : str = "abc" Output : false Input : str = "2e10" Output : true Input : 10e5.4 Output : false
The following cases need to be handled in the code.
- Ignore the leading and trailing white spaces.
- Ignore the ‘+’, ‘-‘ and’.’ at the start.
- Ensure that the characters in the string belong to {+, -, ., e, [0-9]}
- Ensure that no ‘.’ comes after ‘e’.
- A dot character ‘.’ should be followed by a digit.
- The character ‘e’ should be followed either by ‘+’, ‘-‘, or a digit.
Below is implementation of above steps.
C++
// C++ program to check if input number // is a valid number #include <bits/stdc++.h> #include <iostream> using namespace std;
int valid_number(string str)
{ int i = 0, j = str.length() - 1;
// Handling whitespaces
while (i < str.length() && str[i] == ' ' )
i++;
while (j >= 0 && str[j] == ' ' )
j--;
if (i > j)
return 0;
// if string is of length 1 and the only
// character is not a digit
if (i == j && !(str[i] >= '0' && str[i] <= '9' ))
return 0;
// If the 1st char is not '+', '-', '.' or digit
if (str[i] != '.' && str[i] != '+'
&& str[i] != '-' && !(str[i] >= '0' && str[i] <= '9' ))
return 0;
// To check if a '.' or 'e' is found in given
// string. We use this flag to make sure that
// either of them appear only once.
bool flagDotOrE = false ;
for (i; i <= j; i++) {
// If any of the char does not belong to
// {digit, +, -, ., e}
if (str[i] != 'e' && str[i] != '.'
&& str[i] != '+' && str[i] != '-'
&& !(str[i] >= '0' && str[i] <= '9' ))
return 0;
if (str[i] == '.' ) {
// checks if the char 'e' has already
// occurred before '.' If yes, return 0.
if (flagDotOrE == true )
return 0;
// If '.' is the last character.
if (i + 1 > str.length())
return 0;
// if '.' is not followed by a digit.
if (!(str[i + 1] >= '0' && str[i + 1] <= '9' ))
return 0;
}
else if (str[i] == 'e' ) {
// set flagDotOrE = 1 when e is encountered.
flagDotOrE = true ;
// if there is no digit before 'e'.
if (!(str[i - 1] >= '0' && str[i - 1] <= '9' ))
return 0;
// If 'e' is the last Character
if (i + 1 > str.length())
return 0;
// if e is not followed either by
// '+', '-' or a digit
if (str[i + 1] != '+' && str[i + 1] != '-'
&& (str[i + 1] >= '0' && str[i] <= '9' ))
return 0;
}
}
/* If the string skips all above cases, then
it is numeric*/
return 1;
} // Driver code int main()
{ char str[] = "0.1e10" ;
if (valid_number(str))
cout << "true" ;
else
cout << "false" ;
return 0;
} // This code is contributed by rahulkumawat2107 |
Java
// Java program to check if input number // is a valid number import java.io.*;
import java.util.*;
class GFG {
public boolean isValidNumeric(String str)
{
str = str.trim(); // trims the white spaces.
if (str.length() == 0 )
return false ;
// if string is of length 1 and the only
// character is not a digit
if (str.length() == 1 && !Character.isDigit(str.charAt( 0 )))
return false ;
// If the 1st char is not '+', '-', '.' or digit
if (str.charAt( 0 ) != '+' && str.charAt( 0 ) != '-'
&& !Character.isDigit(str.charAt( 0 ))
&& str.charAt( 0 ) != '.' )
return false ;
// To check if a '.' or 'e' is found in given
// string. We use this flag to make sure that
// either of them appear only once.
boolean flagDotOrE = false ;
for ( int i = 1 ; i < str.length(); i++) {
// If any of the char does not belong to
// {digit, +, -, ., e}
if (!Character.isDigit(str.charAt(i))
&& str.charAt(i) != 'e' && str.charAt(i) != '.'
&& str.charAt(i) != '+' && str.charAt(i) != '-' )
return false ;
if (str.charAt(i) == '.' ) {
// checks if the char 'e' has already
// occurred before '.' If yes, return 0.
if (flagDotOrE == true )
return false ;
// If '.' is the last character.
if (i + 1 >= str.length())
return false ;
// if '.' is not followed by a digit.
if (!Character.isDigit(str.charAt(i + 1 )))
return false ;
}
else if (str.charAt(i) == 'e' ) {
// set flagDotOrE = 1 when e is encountered.
flagDotOrE = true ;
// if there is no digit before 'e'.
if (!Character.isDigit(str.charAt(i - 1 )))
return false ;
// If 'e' is the last Character
if (i + 1 >= str.length())
return false ;
// if e is not followed either by
// '+', '-' or a digit
if (!Character.isDigit(str.charAt(i + 1 ))
&& str.charAt(i + 1 ) != '+'
&& str.charAt(i + 1 ) != '-' )
return false ;
}
}
/* If the string skips all above cases, then
it is numeric*/
return true ;
}
/* Driver Function to test isValidNumeric function */
public static void main(String[] args)
{
String input = "0.1e10" ;
GFG gfg = new GFG();
System.out.println(gfg.isValidNumeric(input));
}
} |
Python3
# Python3 program to check if input number # is a valid number def valid_number( str ):
i = 0
j = len ( str ) - 1
# Handling whitespaces
while i< len ( str ) and str [i] = = ' ' :
i + = 1
while j > = 0 and str [j] = = ' ' :
j - = 1
if i > j:
return False
# if string is of length 1 and the only
# character is not a digit
if (i = = j and not ( str [i] > = '0' and
str [i] < = '9' )):
return False
# If the 1st char is not '+', '-', '.' or digit
if ( str [i] ! = '.' and str [i] ! = '+' and
str [i] ! = '-' and not ( str [i] > = '0' and
str [i] < = '9' )):
return False
# To check if a '.' or 'e' is found in given
# string.We use this flag to make sure that
# either of them appear only once.
flagDotOrE = False
for i in range (j + 1 ):
# If any of the char does not belong to
# {digit, +, -,., e}
if ( str [i] ! = 'e' and str [i] ! = '.' and
str [i] ! = '+' and str [i] ! = '-' and not
( str [i] > = '0' and str [i] < = '9' )):
return False
if str [i] = = '.' :
# check if the char e has already
# occurred before '.' If yes, return 0
if flagDotOrE:
return False
if i + 1 > len ( str ):
return False
if ( not ( str [i + 1 ] > = '0' and
str [i + 1 ] < = '9' )):
return False
elif str [i] = = 'e' :
# set flagDotOrE = 1 when e is encountered.
flagDotOrE = True
# if there is no digit before e
if ( not ( str [i - 1 ] > = '0' and
str [i - 1 ] < = '9' )):
return False
# if e is the last character
if i + 1 > len ( str ):
return False
# if e is not followed by
# '+', '-' or a digit
if ( str [i + 1 ] ! = '+' and str [i + 1 ] ! = '-' and
( str [i + 1 ] > = '0' and str [i] < = '9' )):
return False
# If the string skips all the
# above cases, it must be a numeric string
return True
# Driver Code if __name__ = = '__main__' :
str = "0.1e10"
if valid_number( str ):
print ( 'true' )
else :
print ( 'false' )
# This code is contributed by # chaudhary_19 (Mayank Chaudhary) |
C#
// C# program to check if input number // is a valid number using System;
class GFG {
public Boolean isValidNumeric(String str)
{
str = str.Trim(); // trims the white spaces.
if (str.Length == 0)
return false ;
// if string is of length 1 and the only
// character is not a digit
if (str.Length == 1 && ! char .IsDigit(str[0]))
return false ;
// If the 1st char is not '+', '-', '.' or digit
if (str[0] != '+' && str[0] != '-'
&& ! char .IsDigit(str[0]) && str[0] != '.' )
return false ;
// To check if a '.' or 'e' is found in given
// string. We use this flag to make sure that
// either of them appear only once.
Boolean flagDotOrE = false ;
for ( int i = 1; i < str.Length; i++) {
// If any of the char does not belong to
// {digit, +, -, ., e}
if (! char .IsDigit(str[i]) && str[i] != 'e'
&& str[i] != '.' && str[i] != '+'
&& str[i] != '-' )
return false ;
if (str[i] == '.' ) {
// checks if the char 'e' has already
// occurred before '.' If yes, return 0.
if (flagDotOrE == true )
return false ;
// If '.' is the last character.
if (i + 1 >= str.Length)
return false ;
// if '.' is not followed by a digit.
if (! char .IsDigit(str[i + 1]))
return false ;
}
else if (str[i] == 'e' ) {
// set flagDotOrE = 1 when e is encountered.
flagDotOrE = true ;
// if there is no digit before 'e'.
if (! char .IsDigit(str[i - 1]))
return false ;
// If 'e' is the last Character
if (i + 1 >= str.Length)
return false ;
// if e is not followed either by
// '+', '-' or a digit
if (! char .IsDigit(str[i + 1]) && str[i + 1] != '+'
&& str[i + 1] != '-' )
return false ;
}
}
/* If the string skips all above cases,
then it is numeric*/
return true ;
}
// Driver Code
public static void Main(String[] args)
{
String input = "0.1e10" ;
GFG gfg = new GFG();
Console.WriteLine(gfg.isValidNumeric(input));
}
} // This code is contributed by Rajput-Ji |
Javascript
// Javascript code for the above approach function valid_number(str) {
let i = 0;
let j = str.length - 1;
// Handling whitespaces
while (i < str.length && str[i] == ' ' ) {
i++;
}
while (j >= 0 && str[j] == ' ' ) {
j--;
}
if (i > j) {
return false ;
}
// if string is of length 1 and the only character is not a digit
if (i == j && !(str[i] >= '0' && str[i] <= '9' )) {
return false ;
}
// If the 1st char is not '+', '-', '.' or digit
if (
str[i] != '.' &&
str[i] != '+' &&
str[i] != '-' &&
!(str[i] >= '0' && str[i] <= '9' )
) {
return false ;
}
// To check if a '.' or 'e' is found in given string.
// We use this flag to make sure that either of them appear only once.
let flagDotOrE = false ;
for (let k = 0; k <= j; k++) {
// If any of the char does not belong to {digit, +, -,., e}
if (
str[k] != 'e' &&
str[k] != '.' &&
str[k] != '+' &&
str[k] != '-' &&
!(str[k] >= '0' && str[k] <= '9' )
) {
return false ;
}
if (str[k] == '.' ) {
// check if the char e has already occurred before '.'
// If yes, return false
if (flagDotOrE) {
return false ;
}
if (k + 1 > str.length) {
return false ;
}
if (!(str[k + 1] >= '0' && str[k + 1] <= '9' )) {
return false ;
}
} else if (str[k] == 'e' ) {
// set flagDotOrE = true when 'e' is encountered.
flagDotOrE = true ;
// if there is no digit before 'e'
if (!(str[k - 1] >= '0' && str[k - 1] <= '9' )) {
return false ;
}
// if 'e' is the last character
if (k + 1 > str.length) {
return false ;
}
// if 'e' is not followed by '+', '-' or a digit
if (
str[k + 1] != '+' &&
str[k + 1] != '-' &&
!(str[k + 1] >= '0' && str[k + 1] <= '9' )
) {
return false ;
}
}
}
// If the string skips all the above cases, it must be a numeric string
return true ;
} // Driver Code let str = "0.1e10" ;
if (valid_number(str)) {
console.log( "true" );
} else {
console.log( "false" );
} // This code is contributed by adityashatmfh |
Output:
true
Time Complexity: O(n)
Recommended Articles