【问题标题】:How can I parse String to int with the default value? [duplicate]如何使用默认值将 String 解析为 int? [复制]
【发布时间】:2018-01-10 21:39:24
【问题描述】:

我需要将字符串用户 id 解析为整数,因为我使用了Integer.parseInt(String s),但它返回 null/nil,如果字符串具有/包含非十进制/整数值,在这种情况下,我需要分配默认整数值为0

我试过了,但 (? 0) 似乎不起作用,我不知道它的语法是否正确。

String userid = "user001";
int int_userid = Integer.parseInt(userid) ? 0;

如果有空赋值,如何将默认值赋给整数?

String userid 是作为 Web 服务函数调用的一部分的参数参数,因此我无法将其数据类型更新为整数。

【问题讨论】:

  • 您发明了一种 Java 中不存在的语法。 parseInt 如果无法解析字符串,则抛出异常。你可以catch这个例外情况来处理。
  • "但它返回 null,如果字符串具有非整数值" 不,它没有。返回 int 的方法不能返回 null。它抛出一个异常。
  • 当您运行程序时,您应该会在 Eclipse 控制台中看到异常。
  • 有没有办法处理这种情况/问题?

标签: java string integer default-value parseint


【解决方案1】:

该语法不适用于Integer.parseInt(),因为它会导致NumberFormatException

你可以这样处理:

String userid = "user001";
int int_userid;
try {
   int_userid = Integer.parseInt(userid);
} catch(NumberFormatException ex) {
   int_userid = 0;
}

请注意,您的变量名称不符合 Java 代码约定


更好的解决方案是为此创建一个自己的方法,因为我确信您会多次需要它

public static int parseToInt(String stringToParse, int defaultValue) {
    try {
       return Integer.parseInt(stringToParse);
    } catch(NumberFormatException ex) {
       return defaultValue; //Use default value if parsing failed
    }
}

然后您只需使用此方法,例如:

int myParsedInt = parseToInt("user001", 0);

此调用返回默认值0,因为无法解析“user001”。

如果您从字符串中删除“用户”并调用方法...

int myParsedInt = parseToInt("001", 0);

...那么解析将成功并返回 1,因为 int 不能有前导零!

【讨论】:

  • 你是从哪里发明的p_ex??
  • 只是一个变量名,这里没什么可发明的
  • 这只是 NumberFormatException 的一个变量。您可以像 p_ex.printStackTrace() 一样使用它
  • 我知道。问题是什么原因导致您以这种方式调用 Java 变量?
  • 啊,我明白了。我使用“p_”将变量声明为参数
【解决方案2】:
int int_userid;
try {
    int_userid = Integer.parseInt(userid); // try to parse the given user id
} catch (Exception e) {   // catch if any exception
    int_userid = 0; // if exception assign a default value
}

【讨论】:

  • 看,这是答案之一,但唯一一个连字都没有解释...
  • 但这不应该是投反对票的原因,无论如何我会记住这一点。
  • Answers with explanations 对未来的访问者更有用,并且更有可能获得支持。评论投票不计入声誉,因此它们通常用于表示同意。如果您觉得某条评论“太啰嗦”并且应该删除,您可以随时举报它以引起版主注意。
【解决方案3】:
String userid = "user001";
int int_userid = Integer.parseInt(userid) != null ? Integer.parseInt(userid) : 0);

你是说这个语法吗? 但由于int 永远不可能是null,你必须改为:

String userid = "user001";
int int_userid;
try { 
    int_userid= Integer.parseInt(userid);
} catch (NumberFormatexception e) {
    int_userid = 0;
}

【讨论】:

    【解决方案4】:

    您可以像这样将这种方式与String::matches 一起使用:

    String userid = "user001";
    int int_userid = userid.matches("\\d+") ? Integer.parseInt(userid) : 0;
    

    您也可以将-?\d+ 用于正值和负值:

    int int_userid = userid.matches("-?\\d+") ? Integer.parseInt(userid) : 0;
    

    【讨论】:

    • 不是我的反对意见,我不是正则表达式专家,但它似乎是一种迂回的方式,它不会因为负数而失败吗?
    • @PeterJ 现在呢? :)
    • @YCF_L 完美的过度工程:D
    • 你成功了。优秀
    • @YCF_L 看起来更好,但它不需要边界检查以确保它可以映射到 int 吗?
    【解决方案5】:

    我相信你可以通过以下方法实现你想要的:

    public static int parseIntWithDefault(String s, int default) {
        try {
            return Integer.parseInt(s);
        } catch(NumberFormatException e) {
            return default;
        }
    }
    

    现在只需分配:

    int int_userid = parseIntWithDefault(userId, 0);
    

    请记住,使用Java 应该使用Java 格式化代码的良好做法。 int_userid 绝对有待改进。

    【讨论】:

    • 快速问题,通常使用 try/catch 处理逻辑流是一种反模式。我想在这种情况下这是唯一的选择,对吧?验证 s 不是 null 并且仅使用数字、点或那种验证创建更好吗?
    【解决方案6】:

    你可以用正则表达式试试这个方法。

    public static int parseWithDefault(String s, int defaultVal) {
        return s.matches("-?\\d+") ? Integer.parseInt(s) : defaultVal;   
    }
    

    【讨论】:

    • 如果值超出一个int的范围,它将不起作用。
    【解决方案7】:

    您很可能已经在使用 apache.commons.lang3:

    NumberUtils.toInt(str, 0);
    

    【讨论】:

    • 这是最好的
    【解决方案8】:

    这可能有点过度设计,但您可以将 Guava 的 Ints.tryParse(String) 与 Java 8 的 Optionals 一起使用,如下所示:

    int userId = Optional.ofNullable(Ints.tryParse("userid001")).orElse(0)
    

    【讨论】:

    • 这引入了额外的装箱和拆箱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多