可能重复:
Java:封装Integer.parseInt()的好方法
如何将字符串转换为float并避免在java中使用try/catch?
C#有Int.TryParse:Int32.TryParse方法(String,Int32%)
这种方法的优点在于它不会为坏数据抛出异常.
在java中,Integer.parseInt("abc")将抛出异常,并且在可能发生这种情况的情况下,很多性能将受到影响.
对于那些性能问题的情况,有没有办法解决这个问题?
我能想到的另一种方法是针对正则表达式运行输入,但我必须测试以查看更快的内容.
因为我认为这是一个很好的编程实践,所以final如果它们只打算编写一次,我会创建所有(本地或实例)变量.
但是,我注意到当变量赋值可以抛出异常时,你不能使变量最终变为:
final int x;
try {
x = Integer.parseInt("someinput");
}
catch(NumberFormatException e) {
x = 42; // Compiler error: The final local variable x may already have been assigned
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在不诉诸临时变量的情况下做到这一点?(或者这不是最终修饰符的正确位置?)
在我有限的经验中,我参与了几个项目,这些项目有一些字符串实用程序类,其中包含确定给定字符串是否为数字的方法.这个想法一直都是一样的,然而,实施却有所不同.有些使用try/catch包围解析尝试
public boolean isInteger(String str) {
try {
Integer.parseInt(str);
return true;
} catch (NumberFormatException nfe) {}
return false;
}
Run Code Online (Sandbox Code Playgroud)
和其他人匹配正则表达式
public boolean isInteger(String str) {
return str.matches("^-?[0-9]+(\\.[0-9]+)?$");
}
Run Code Online (Sandbox Code Playgroud)
这些方法中的一种比另一种更好吗?我个人更喜欢使用正则表达式方法,因为它很简洁,但是如果在迭代过程中调用,例如,数十万个字符串的列表,它会在par上执行吗?
注意:由于我是网站的新手,我不完全理解这个社区Wiki业务,所以如果这属于那里让我知道,我很乐意移动它.
编辑: 有了所有的TryParse建议,我把Asaph的基准代码(感谢一个很棒的帖子!)移植到C#并添加了一个TryParse方法.而且看起来,TryParse赢得了胜利.然而,尝试捕获方法耗费了大量时间.我认为我做错了什么!我还更新了正则表达式来处理负数和小数点.
更新的C#基准代码的结果:
00:00:51.7390000 for isIntegerParseInt
00:00:03.9110000 for isIntegerRegex
00:00:00.3500000 for isIntegerTryParse
Run Code Online (Sandbox Code Playgroud)
使用:
static bool isIntegerParseInt(string str) {
try {
int.Parse(str);
return true;
} catch (FormatException e){}
return false;
}
static bool isIntegerRegex(string str) {
return Regex.Match(str, "^-?[0-9]+(\\.[0-9]+)?$").Success;
}
static bool isIntegerTryParse(string str) {
int bob;
return Int32.TryParse(str, out bob); …Run Code Online (Sandbox Code Playgroud) 有一些情况我需要将字符串转换为浮点数或其他一些数值数据类型,但有可能获得一些不可转换的值,如" - "或"/",我无法预先验证所有值以删除他们.我想避免使用try/catch这个问题,还有其他方法在java中进行正确的转换吗?类似于C#的东西TryParse?
我需要一个正则表达式来验证整数.05 and 00不允许但0允许.目前我有这个:
/^[1-9]\d*$/
Run Code Online (Sandbox Code Playgroud)
但它不允许0.感谢帮助.
我需要将字符串用户id解析为我使用的整数Integer.parseInt(String s)但它返回null/nil,如果有字符串有/保持非十进制/整数值,那么我需要将默认整数值指定为0.
我试过这个,但它(? 0)似乎不起作用,我不知道它是否是正确的语法.
String userid = "user001";
int int_userid = Integer.parseInt(userid) ? 0;
Run Code Online (Sandbox Code Playgroud)
如果存在空赋值,如何将默认值赋给整数?
字符串userid是一个参数参数,作为Web服务函数调用的一部分,因此我无法将其数据类型更新为整数.
我想检查是否String传递给Integer.valueOf(String s)要解析的有效String.如果一个不可解析,我需要返回0.
我是通过以下方式完成的:
try{
Integer.valueOf(String s)
} catch(NumberFormatException e) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这样做是不好的方法吗?
java ×5
integer ×2
string ×2
c# ×1
final ×1
javascript ×1
parseint ×1
performance ×1
regex ×1
try-catch ×1