以安全的方式将字符串转换为整数

问题描述 投票:0回答:7

我有一个小方法,除此之外还可以将字符串转换为整数。由于该字符串是该方法的参数,我想确保该字符串是可转换的。所以我只是想知道什么是最安全和/或最快的方法。


版本A:保持原样并承担风险(我试图避免)

public static int stringToInt(String param) {
        return Integer.valueOf(param);
}

(从速度上来说,B版和C版会有什么样的区别?)


版本B:捕获异常

public static int stringToInt(String param) {
        try {
                return Integer.valueOf(param);
        } catch(NumberFormatException e) {
                return -1;
        }
}

版本C:检查字符串的每个字母,看看它是否是数字

public static int stringToInt(String param) {
        for(char c : param.toCharArray()) {
                if(!Character.isDigit(c))
                        return -1;
        }
        return Integer.valueOf(param);
}

请注意,参数必须是正数,-1 应该是我的小程序中的“错误值”,换句话说,所有三个版本的方法都可以在我的程序中完美运行。

我非常乐意接受您给我的任何其他建议,因此,如果您认为自己的版本更好,请随意创建您自己的版本。

非常感谢您提前的支持。

java type-conversion
7个回答
12
投票

Guava 为此提供了一个实用方法,如果您的字符串无法解析,该方法将返回 null。

https://google.github.io/guava/releases/19.0/api/docs/com/google/common/primitives/Ints.html#tryParse(java.lang.String)

Integer result = Ints.tryParse("1");  //returns 1
Integer result = Ints.tryParse("-1"); //returns -1
Integer result = Ints.tryParse("a");  //returns null

7
投票

首先,请注意版本

C
并不是万无一失的:它会拒绝负数,并且不会捕获太大的数字。

版本

B
是可以的,但它使调用者改变编码风格:调用者需要始终检查
-1
,而不是捕获错误并将其与其他错误一起处理。在读取多个整数的情况下,这可能不是最佳的,但错误处理并不取决于哪一个特定的整数失败。此外,使用您的 API 的新编码员可能会忘记检查
-1
,并无意中使用错误代码。

这就是为什么我会保留第一个选项:使用版本

A
的代码对于任何了解 Java API 的人来说都会立即看起来很熟悉,而无需了解函数内部发生的情况。


3
投票

我相信修改 B 来抛出异常而不是返回 -1 将是最好的选择。最好将异常抛出到可以对其进行处理以向用户发送正确响应的级别。返回像 -1 这样的值会让你的代码容易出错。假设另一个程序员正在使用您的方法,并且他/她只有您方法的签名。因此,从签名中并不清楚他/她应该编写什么代码来处理异常或错误情况。但是,如果您抛出异常并将其添加到方法声明中,那么其他程序员将能够正确使用您的方法以及所需的异常处理。对我来说,这看起来是最好的:

public static int stringToInt(String param) throws NumberFormatException {
        try {
                return Integer.valueOf(param);
        } catch(NumberFormatException e) {
               // return -1;
               throw e;
        }
}

1
投票

没有任何 API 的 Java 8:

 Optional.ofNullable(strNum)
         .map(Integer::valueOf).orElse(null);

1
投票
public int stringToInt(String param) throws NumberFormatException {

    Optional.ofNullable(param.replaceAll("\\s+", ""))
         .map(Integer::valueOf).orElse(null);

/*
                      or

    Optional.ofNullable(param.replaceAll(" ", ""))
         .map(Integer::valueOf).orElse(null);

*/

}

使用replaceAll来替换空格,尽管似乎不需要,但加号对CPU是友好的。


0
投票

我使用了 2 个答案的组合,以保证空值、空字符串或空白字符串以及非数字字符的安全性:

public static Integer safeStringToInt(String param) {
    return Optional.ofNullable(param).map(Ints::tryParse).orElse(null);
}

0
投票

我希望这对某人有帮助:
请注意: StringUtils 来自 'org.apache.commons.lang3.StringUtils'

public static void main(String[] args) {

        String nullable = "";
        Integer result = Optional.ofNullable("").filter(StringUtils::isNotBlank).map(Integer::valueOf).orElse(0);
        System.out.println("Result1: " + result);

        nullable = null;
        result = Optional.ofNullable(nullable).filter(StringUtils::isNotBlank).map(Integer::valueOf).orElse(0);
        System.out.println("Result2: " + result);

        nullable = "6";
        result = Optional.ofNullable(nullable).filter(StringUtils::isNotBlank).map(Integer::valueOf).orElse(0);
        System.out.println("Result3: " + result);

        nullable = "a";
        result = Optional.ofNullable(nullable).filter(StringUtils::isNotBlank)
                            .filter(StringUtils::isNumeric).map(Integer::valueOf).orElse(0);
        System.out.println("Result4: " + result);
    }

Output:

Result1: 0
Result2: 0
Result3: 6
Result4: 0
© www.soinside.com 2019 - 2024. All rights reserved.