首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查字符串所代表的数字是否和类型?

如何检查字符串所代表的数字是否和类型?
EN

Stack Overflow用户
提问于 2012-01-27 23:27:50
回答 6查看 710关注 0票数 7

如何检查字符串是表示长字符串、双字符串还是普通字符串?我需要这样做,因为这个值需要根据其类型在数据库中进行索引。目前,我正在尝试解析字符串并检查异常,但由于代码被频繁调用,我想知道是否有更有效的方法。我的代码当前如下所示:

代码语言:javascript
复制
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
    }
}

编辑:

我只是按照@ use 949300关于使用regex模式的建议做了一个快速基准测试,它的性能略好于上面的异常处理代码。下面是代码,以防其他人发现它有用:

代码语言:javascript
复制
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%字符串(代表我的应用程序处理的工作负载):

代码语言:javascript
复制
--- 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
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-01-27 23:40:22

您考虑过正则表达式吗?

如果字符串包含-(开头)和0-9或.以外的任何内容,则它是一个字符串。(注意--这忽略了国际化和科学符号-它们是问题吗?)

否则,它包含一个.,它是一个双。(嗯,你应该只测试一次,但这是个开始)

否则,这是一个漫长的。

出于偏执,我仍然可能检查例外,但这可能是一个更快的方法。

注意,我猜想测试regex比从各种解析例程中抛出异常要快,但这可能不是真的。你应该做些测试。

票数 3
EN

Stack Overflow用户

发布于 2012-01-27 23:31:09

据我所知,没有其他优雅的方法可以做到这一点。我建议您按照最常见到最不常见的顺序解析它们,以便尽可能快地解析它们。

如果您有超过3种可能的类型,您将有一个深度和丑陋的try-catch嵌套,但从技术上讲,它将比将每次解析尝试放入自己的方法要快;这里的权衡是您希望代码清晰还是执行更快--听起来您可能想要后者。

票数 2
EN

Stack Overflow用户

发布于 2012-01-27 23:37:40

您可能会得到一些改进(特别是如果您可以排除科学符号,如1e12),只需检查非数字来检测一个长。

Long.parseLong()委托给在任何数字基中工作的通用方法,所以十进制方法可能会更快一些。

别忘了负号,如果这些在你的数据中是可能的.

由于654.1236871是有效的,所以加倍更难,但是654.12.36.87...1不是,尽管它们包含相同的字符集。因此,可能需要进行完整的解析。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9041437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档