gpt4 book ai didi

c# - isNumber(string) 方法的最佳实现

转载 作者:IT王子 更新时间:2023-10-29 04:47:32 26 4
gpt4 key购买 nike

以我有限的经验,我参与过的几个项目都有某种字符串实用程序类,这些类具有确定给定字符串是否为数字的方法。想法一直是一样的,但是实现却不同。有些用 try/catch 包围解析尝试

public boolean isInteger(String str) {
try {
Integer.parseInt(str);
return true;
} catch (NumberFormatException nfe) {}
return false;
}

和其他匹配正则表达式

public boolean isInteger(String str) {
return str.matches("^-?[0-9]+(\\.[0-9]+)?$");
}

这些方法中的一种比另一种好吗?我个人更喜欢使用正则表达式方法,因为它很简洁,但如果在迭代时调用它是否会执行相同的操作,比如说,一个包含数十万个字符串的列表?

注意:由于我是该站点的新手,所以我并不完全了解这个 Community Wiki 业务,所以如果它属于那里,请告诉我,我很乐意将其移动。

编辑:根据所有 TryParse 建议,我将 Asaph 的基准代码(感谢您的精彩帖子!)移植到 C# 并添加了 TryParse 方法。看起来,TryParse 轻而易举地获胜了。然而,try catch 方法花费了大量的时间。以至于我认为我做错了什么!我还更新了正则表达式来处理负数和小数点。

更新的 C# 基准代码的结果:

00:00:51.7390000 for isIntegerParseInt
00:00:03.9110000 for isIntegerRegex
00:00:00.3500000 for isIntegerTryParse

使用:

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);
}

最佳答案

我刚刚对这两种方法的性能进行了一些基准测试(在 Macbook Pro OSX Leopard Java 6 上)。 ParseInt 更快。这是输出:

This operation took 1562 ms.
This operation took 2251 ms.

这是我的基准代码:


public class IsIntegerPerformanceTest {

public static boolean isIntegerParseInt(String str) {
try {
Integer.parseInt(str);
return true;
} catch (NumberFormatException nfe) {}
return false;
}

public static boolean isIntegerRegex(String str) {
return str.matches("^[0-9]+$");
}

public static void main(String[] args) {
long starttime, endtime;
int iterations = 1000000;
starttime = System.currentTimeMillis();
for (int i=0; i<iterations; i++) {
isIntegerParseInt("123");
isIntegerParseInt("not an int");
isIntegerParseInt("-321");
}
endtime = System.currentTimeMillis();
System.out.println("This operation took " + (endtime - starttime) + " ms.");
starttime = System.currentTimeMillis();
for (int i=0; i<iterations; i++) {
isIntegerRegex("123");
isIntegerRegex("not an int");
isIntegerRegex("-321");
}
endtime = System.currentTimeMillis();
System.out.println("This operation took " + (endtime - starttime) + " ms.");
}
}

另请注意,您的正则表达式将拒绝负数,而 parseInt 方法将接受它们。

关于c# - isNumber(string) 方法的最佳实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1369077/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com