Check if a given string is a valid number (Integer or Floating Point) | SET 1(Basic approach)
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)