马士兵java架构师

您现在的位置是:java学习笔记 >

java学习笔记

如何在Java中判断一个字符串是否只包含数字?

2023-11-21 19:48:57java学习笔记 本文浏览次数:1 百度已收录

本 文 目 录

许多人在编程过程中都会遇到这样的需求:判断一个字符串是否只包含了数字。在网上搜索相关教程时可能会发现不少看似可行的方法,但实际操作起来却存在各种问题。本文将介绍几种常用的解决方案,并分析其优缺点。

第一种方法是利用Java内置的Character.isDigit函数。

以下是一段示例代码:

public static boolean isNumericZidai(String str) {
    for (int i = 0; i < str.length(); i++) {
        System.out.println(str.charAt(i));
        if (!Character.isDigit(str.charAt(i))) {
            return false;
        }
    }
    return true;
}

然而,这段代码并不能处理负数,例如"-19162431.1254"会被判断为假。

第二种方法是使用正则表达式。

下面是一段使用正则表达式的代码:

public static boolean isNumericzidai(String str) {
    Pattern pattern = Pattern.compile("-?[0-9]+.?[0-9]+");
    Matcher isNum = pattern.matcher(str);
    if (!isNum.matches()) {
        return false;
    }
    return true;
}

虽然网上称这种方式可以匹配任何数字,但实际上它存在漏洞,无法正确处理像"-19162431a1254"这样的字符串。 正确的正则表达式应该是-?[0-9]+\\.?[0-9]*。但是,当我们尝试使用此表达式去匹配很长的数字时,例如"9162431.1254",会被转换成科学计数法形式,如-1.91624311254E7,这就会导致问题出现。

针对这种情况,我们可以使用Java中的BigDecimal类。

如下所示:

public static boolean isNumeric(String str) {
    String bigStr;
    try {
        bigStr = new BigDecimal(str).toString();
    } catch (Exception e) {
        return false;
    }
    return true;
}

这种方法可以在输入包含中文或者非常长的数字的情况下,仍然能够正确工作。但是如果要处理小数点的情况,还需要做额外的处理。

为了应对这些问题,我们可以结合正则表达式和BigDecimal,实现更加强大的判断功能:

/**
 * 匹配是否为数字
 * @param str 可能为中文,也可能是-19162431.1254,不使用BigDecimal的话,变成-1.91624311254E7
 */
import java.math.BigDecimal;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class jj9 {
    public static boolean isNumeric(String str) {
        String bigStr;
        try {
            bigStr = new BigDecimal(str).toString();
        } catch (Exception e) {
            return false;
        }
        Pattern pattern = Pattern.compile("-?[0-9]+(\\.[0-9]+)?");
        Matcher isNum = pattern.matcher(bigStr);
        if (!isNum.matches()) {
            return false;
        }
        return true;
    }

    public static void main(String[] args) {
        String gary = "-566255123.330009";
        boolean isNumeric = isNumeric(gary);
        System.out.println("Is numeric: " + isNumeric);
    }
}

此外,Apache Commons Lang库中提供了StringUtils.isNumeric函数,它可以用来检查一个字符串是否仅包含Unicode数字。但是经过测试,它也无法正确处理负数。总的来说,建议使用修正后的正则表达式和BigDecimal类来解决问题。(本文以山鬼谣me为首发,相关内容为学习后的笔记,如有侵权请告知。)