Core Java

Check If String Is A Valid Number In Java

In programming, it is common to validate user input to ensure it adheres to the expected format. One frequent validation involves checking if a given string represents a valid number. Let us delve into understanding how to use Java to check if a string is a valid number.

1. Using Character and Looping

A straightforward approach is to iterate through each character of the string and ensure all characters are numeric (or include a single decimal point for floating-point numbers). Below is the code example:

package practice;

public class Test {

    public static boolean isValidNumber(String str) {
        if (str == null || str.isEmpty()) {
            return false;
        }
        boolean hasDecimalPoint = false;
        for (char ch : str.toCharArray()) {
            if (ch == '.') {
                if (hasDecimalPoint) {
                    return false; // Multiple decimal points
                }
                hasDecimalPoint = true;
            } else if (!Character.isDigit(ch)) {
                return false; // Non-digit character
            }
        }
        return true;
    }

    public static void main(String[] args) {
        System.out.println(isValidNumber("123"));        // true
        System.out.println(isValidNumber("12.3"));       // true
        System.out.println(isValidNumber("12.3.4"));     // false
        System.out.println(isValidNumber("abc"));        // false
    }
}

1.1 Code Explanation

The given Java code demonstrates a method to check whether a string is a valid numeric representation. It uses a combination of character iteration and logical checks. Here’s a breakdown of the code:

The class Test contains a static method isValidNumber, which takes a string input and returns a boolean indicating whether the string is a valid number. First, it checks if the string is null or empty, returning false if so.

The method then iterates through each character of the string using a for-each loop. A flag variable, hasDecimalPoint, tracks whether a decimal point has already been encountered. If the character is a decimal point (‘.’), the method checks if it has already been seen; if so, it returns false because multiple decimal points are not valid in a number. If the character is not a digit and not a decimal point, the method immediately returns false, indicating the presence of an invalid character.

If the string passes all these checks, the method returns true, confirming the input is a valid numeric representation. In the main method, several test cases are provided to validate this logic:

  • "123": Returns true, as it is a valid integer.
  • "12.3": Returns true, as it is a valid decimal number.
  • "12.3.4": Returns false, due to multiple decimal points.
  • "abc": Returns false, as it contains non-numeric characters.

This method is a simple and efficient way to validate numeric strings in Java, handling both integers and decimals but excluding numbers with invalid formats.

1.2 Code Output

The code when executed gives the following output:

true
true
false
false

2. Using Integer.parseInt() and Double.parseDouble()

Java provides methods like Integer.parseInt() and Double.parseDouble() to convert strings into numeric values. We can leverage these methods to validate if a string is numeric. Below is the code example:

package practice;

public class Test {

    public static boolean isValidInteger(String str) {
        try {
            Integer.parseInt(str);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }

    public static boolean isValidDouble(String str) {
        try {
            Double.parseDouble(str);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }

    public static void main(String[] args) {
        System.out.println(isValidInteger("123"));        // true
        System.out.println(isValidInteger("12.3"));       // false
        System.out.println(isValidDouble("12.3"));        // true
        System.out.println(isValidDouble("abc"));         // false
    }
}

2.1 Code Explanation

The provided Java code demonstrates how to validate if a string can be parsed into a valid integer or double. It contains two methods, isValidInteger and isValidDouble, each utilizing Java’s built-in parsing methods, Integer.parseInt and Double.parseDouble, respectively. Here’s a detailed explanation of the code:

The method isValidInteger takes a string as input and attempts to parse it into an integer using Integer.parseInt. If the string is successfully parsed, the method returns true, indicating that the string represents a valid integer. If a NumberFormatException occurs (which happens when the string cannot be parsed as an integer), the method catches the exception and returns false, indicating the string is not a valid integer.

Similarly, the isValidDouble method checks if the string can be parsed into a valid double using Double.parseDouble. If the string represents a valid double (such as a decimal number), the method returns true. If the parsing fails due to a NumberFormatException, it returns false.

In the main method, several test cases are executed:

  • isValidInteger("123"): Returns true because “123” is a valid integer.
  • isValidInteger("12.3"): Returns false because “12.3” is not an integer.
  • isValidDouble("12.3"): Returns true because “12.3” is a valid double.
  • isValidDouble("abc"): Returns false because “abc” cannot be parsed as a number.

This approach effectively checks whether a string can be interpreted as a valid integer or double, handling the cases where the string does not represent a valid number by catching exceptions.

2.2 Code Output

The code when executed gives the following output:

true
false
true
false

3. Using BigDecimal

The BigDecimal class provides precise handling of numeric data, especially useful for financial and scientific computations. It can also validate numeric strings. Below is the code example:

package practice;

import java.math.BigDecimal;

public class Test {

    public static boolean isValidBigDecimal(String str) {
        try {
            new BigDecimal(str);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }

    public static void main(String[] args) {
        System.out.println(isValidBigDecimal("123.45"));   // true
        System.out.println(isValidBigDecimal("1e10"));     // true
        System.out.println(isValidBigDecimal("abc"));      // false
    }
}

3.1 Code Explanation

The given Java code demonstrates how to check if a string is a valid numeric representation using the BigDecimal class. The class Test contains a method called isValidBigDecimal, which takes a string as input and determines whether it can be parsed into a valid BigDecimal object.

The isValidBigDecimal method attempts to create a new BigDecimal from the provided string. If the string is a valid number, the BigDecimal object is successfully created, and the method returns true. If the string cannot be parsed into a BigDecimal (e.g., due to invalid characters or incorrect format), a NumberFormatException is thrown. In this case, the method catches the exception and returns false.

The main method includes several test cases to verify the functionality:

  • isValidBigDecimal("123.45"): Returns true, as “123.45” is a valid BigDecimal representing a decimal number.
  • isValidBigDecimal("1e10"): Returns true, as “1e10” is a valid scientific notation that BigDecimal can handle.
  • isValidBigDecimal("abc"): Returns false, as “abc” cannot be parsed into a valid BigDecimal.

This method is useful for performing precise numerical validation, especially when dealing with large numbers or requiring high precision, which the BigDecimal class is designed to handle.

3.2 Code Output

The code when executed gives the following output:

true
true
false

4. Using Regular Expressions

Regular Expressions offer a flexible way to validate numeric strings. The following pattern checks for integers, decimals, and scientific notation. Below is the code example:

package practice;

import java.util.regex.Pattern;

public class Test {

    public static boolean isValidRegex(String str) {
        String regex = "^[+-]?\\d*(\\.\\d+)?([eE][+-]?\\d+)?$";
        return Pattern.matches(regex, str);
    }

    public static void main(String[] args) {
        System.out.println(isValidRegex("123"));          // true
        System.out.println(isValidRegex("-12.3"));        // true
        System.out.println(isValidRegex("1e10"));         // true
        System.out.println(isValidRegex("abc"));          // false
    }
}

4.1 Code Explanation

The provided Java code demonstrates how to use regular expressions (regex) to validate whether a string represents a valid number. The class Test contains a method called isValidRegex, which uses a regular expression pattern to check if a string matches the format of a valid integer, decimal number, or scientific notation.

In the isValidRegex method, a regex pattern is defined as ^[+-]?\\d*(\\.\\d+)?([eE][+-]?\\d+)?$. This pattern is explained as follows:

  • ^[+-]?: Optionally matches a plus or minus sign at the beginning of the string.
  • \\d*: Matches zero or more digits before the decimal point.
  • (\\.\\d+)?: Optionally matches a decimal point followed by one or more digits, representing the fractional part of the number.
  • ([eE][+-]?\\d+)?: Optionally matches an ‘e’ or ‘E’ followed by an optional sign and one or more digits, allowing for scientific notation.
  • $: Ensures that the entire string matches the pattern, from start to end.

The method then uses Pattern.matches(regex, str) to check if the input string matches the regex pattern. If the string matches, the method returns true, indicating a valid number. Otherwise, it returns false.

In the main method, several test cases are executed to verify the functionality of the isValidRegex method:

  • isValidRegex("123"): Returns true, as “123” is a valid integer.
  • isValidRegex("-12.3"): Returns true, as “-12.3” is a valid decimal number.
  • isValidRegex("1e10"): Returns true, as “1e10” is a valid scientific notation number.
  • isValidRegex("abc"): Returns false, as “abc” is not a valid number.

This method is highly useful for validating numeric strings in various formats, including integers, decimals, and scientific notation, by utilizing the power of regular expressions for pattern matching.

4.2 Code Output

The code when executed gives the following output:

true
true
true
false

5. Using Apache Commons NumberUtils

The Apache Commons Lang library provides a convenient NumberUtils class with methods for number validation. Ensure to add the following dependency in your Maven project to use this library:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>your__jar__version</version>
</dependency>

Below is the code example:

import org.apache.commons.lang3.math.NumberUtils;

public class Test {

    public static boolean isValidNumberWithCommons(String str) {
        return NumberUtils.isCreatable(str);
    }

    public static void main(String[] args) {
        System.out.println(isValidNumberWithCommons("123"));      // true
        System.out.println(isValidNumberWithCommons("-12.3"));    // true
        System.out.println(isValidNumberWithCommons("1e10"));     // true
        System.out.println(isValidNumberWithCommons("abc"));      // false
    }
}

5.1 Code Explanation

The given Java code demonstrates how to validate if a string is a valid number using the NumberUtils class from the Apache Commons Lang library. The class Test contains a method called isValidNumberWithCommons, which leverages the isCreatable method from NumberUtils to determine if a string can be parsed into a valid numeric value.

The isValidNumberWithCommons method simply calls NumberUtils.isCreatable(str), which checks if the input string can be interpreted as a valid number. This includes integers, floating-point numbers, and numbers in scientific notation. If the string is valid, the method returns true, otherwise, it returns false.

In the main method, several test cases are executed:

  • isValidNumberWithCommons("123"): Returns true, as “123” is a valid integer.
  • isValidNumberWithCommons("-12.3"): Returns true, as “-12.3” is a valid decimal number.
  • isValidNumberWithCommons("1e10"): Returns true, as “1e10” is a valid scientific notation number.
  • isValidNumberWithCommons("abc"): Returns false, as “abc” is not a valid number.

This method is particularly useful when working with Apache Commons Lang as it offers an easy and reliable way to validate strings as numeric values without needing to implement custom parsing logic. The isCreatable method internally handles various valid number formats such as integers, decimals, and scientific notation.

5.2 Code Output

The code when executed gives the following output:

true
true
true
false

6. Conclusion

Validating if a string is numeric can be achieved through several methods, each with its unique advantages. For simple checks, loops or parsing methods suffice. When dealing with scientific notations or decimals, BigDecimal or regular expressions are more robust. For library-based solutions, Apache Commons offers an out-of-the-box utility. Choose the approach best suited for your application’s requirements.

Yatin Batra

An experience full-stack engineer well versed with Core Java, Spring/Springboot, MVC, Security, AOP, Frontend (Angular & React), and cloud technologies (such as AWS, GCP, Jenkins, Docker, K8).
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Back to top button