java 安全地将字符串转换为整数

xqk2d5yq  于 12个月前  发布在  Java
关注(0)|答案(7)|浏览(180)

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

版本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应该是我的小程序中的“错误值”,换句话说,所有三个版本的方法都可以在我的程序中完美地工作。
我非常开放的任何其他建议,你可以给给予我,所以随时创建自己的版本,如果你认为你的更好。
非常感谢您的支持提前。

rggaifut

rggaifut1#

Guava为此提供了一个实用方法,如果无法解析String,该方法将返回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

字符串

nbysray5

nbysray52#

首先,请注意C版本不是防弹的:它会拒绝负数,不会捕获太大的数字。
版本B是可以的,但它使调用者改变编码风格:调用者需要一直检查-1,而不是捕获错误并将其与其他错误一起处理。在读取多个整数的情况下,这可能不是最佳的,但错误处理并不取决于哪个特定的整数失败。此外,使用您的API的新程序员可能会忘记检查-1,并无意中使用错误代码。
这就是为什么我会坚持第一种选择:任何了解Java API的人都会立即熟悉使用A版本的代码,而不需要了解函数内部发生了什么。

d6kp6zgx

d6kp6zgx3#

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

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

字符串

bzzcjhmw

bzzcjhmw4#

没有任何API的Java 8:

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

字符串

kgsdhlau

kgsdhlau5#

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友好的,即使似乎不需要。

13z8s7eq

13z8s7eq6#

我使用了2个答案的组合,使其对null,空或空白字符串和非数字字符安全:

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

字符串

jk9hmnmh

jk9hmnmh7#

我希望这对某人有所帮助:

**请注意:**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(NumberUtils::isCreatable).map(Integer::valueOf).orElse(0);
        System.out.println("Result4: " + result);
    }

Output:

Result1: 0
Result2: 0
Result3: 6
Result4: 0

字符串

相关问题