如何检查一个字符串是代表一个长整数,一个双整数还是一个常规字符串?我需要这样做,因为此值需要根据其类型在数据库中编入索引。目前我正在通过尝试解析字符串和检查异常来做到这一点,但由于代码被非常频繁地调用,所以我想知道是否有更高效的方法来执行此操作。我的代码目前看起来是这样的:如何检查字符串是否代表什么类型的数字?
String value = ...;
// For example, could be "213678", "654.1236781", or "qwerty12345"
try {
Long longValue = Long.parseLong(value);
// Index 'longValue' in the database
} catch (NumberFormatException parseLongException) {
try {
Double doubleValue = Double.parseDouble(value);
// Index 'doubleValue' in the database
} catch (NumberFormatException parseDoubleException) {
// Index 'value' in the database
}
}
编辑:
我只是做了一个快速的基准测试按@ user949300的建议,使用正则表达式的模式,它的性能比上面的异常处理代码略胜一筹。下面是万一别人的代码,发现它有用:
Pattern longPattern = Pattern.compile("^[-+]?[0-9]+$");
Pattern doublePattern = Pattern.compile("^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$");
// Check for long regex pattern before the double regex pattern
// since the former is a strict subset of the latter
if (longPattern.matcher(value).matches()) {
// Perform indexing for long in the database
} else if (doublePattern.matcher(value).matches()) {
// Perform indexing for double in the database
} else {
// Perform indexing for string in the database
}
这里是检查了50 000个,其中的类型大致细分为50个%多头,10个%双打,40名%的字符串(代表工作量的基准测试结果我的应用程序进程):
--- Exception handling code ---
STRING - actual: 19861, found: 19861
DOUBLE - actual: 4942, found: 4942
LONG - actual: 25197, found: 25197
Time taken: 2561 ms
--- Regex pattern matching code ---
STRING - actual: 19861, found: 19861
DOUBLE - actual: 4942, found: 4942
LONG - actual: 25197, found: 25197
Time taken: 1565 ms
如果您正在使用'java 7'而不是看看[multi-catch-blocks-for-exceptions](http://extreme-java.blogspot.com/2011/05/jdk-7 -multi-catch-blocks-for-exceptions.html) – RanRag 2012-01-27 23:38:16
@RanRag我看不出在这种情况下multi-catch-blocks是如何有用的。第二个捕获是在第一个catch块之内 - 而不是在之后。 – emory 2012-01-27 23:54:53
你是对的我没有看到。 – RanRag 2012-01-27 23:55:28