最优雅的是java的数字()解决方案

问题描述:

我现在将一小段PHP代码移植到java中,并且我依靠函数is_numeric($x)来确定$x是否是数字。在java中似乎没有一个等价的函数,我对目前发现的当前解决方案并不满意。最优雅的是java的数字()解决方案

我倾向于正则表达式的解决方案在这里找到:http://rosettacode.org/wiki/Determine_if_a_string_is_numeric

我应该使用哪种方法,为什么?

+0

你的意思是什么数字?你想要完全准确的PHP定义吗? http://php.net/manual/en/function.is-numeric.php – 2010-08-17 21:37:39

+0

不必完全匹配PHP定义,但是如果它确实如此,那将是非常好的,因为我知道我的算法适用于该函数。 – Doug 2010-08-17 21:46:30

请注意,PHP isNumeric()函数将正确确定十六进制和科学记数法是数字,正则表达式方法链接到不会。

一个选项,特别是如果您已经在使用Apache Commons库,则使用Commons-Lang的NumberUtils.isNumber()。它将处理PHP函数将处理的相同情况。

+0

这个函数看起来确实是我想要的,但是我没有使用apache commons库:( – Doug 2010-08-17 22:30:30

+3

@Doug Commons lang几乎存在于所有的java程序中,它有助于*很多方面。下载它并添加它会给你的类路径,你会很高兴你做到了 – TheLQ 2010-08-17 23:26:26

+2

当你只需要一小段时间来决定添加一个库是否合理时,总是很棘手的,但是如果你仔细研究一下它,很可能你会发现Apache Commons Lang可以给你其他的东西,你可以使用 - 它基本上是“应该内置到Java的东西,但不是”。我强烈推荐The Common Java Cookbook(http://www.discursive.com/ books/cjcook/reference/book-cjcook.html),它提供了很多关于使用Apache库的技巧。 – 2010-08-18 13:22:25

你试过Integer.parseInt()吗? (我不确定方法名称,但Integer类有一个方法可以根据字符串创建一个Integer对象)。或者,如果您需要处理非整数数字,则类似的方法也可用于Double对象。如果这些失败,则抛出异常。

如果您需要解析非常大的数字(大于int/double),并且不需要确切的值,那么基于正则表达式的简单方法可能就足够了。

+2

如果您希望有一个非数字字符串的合理比例,则使用抛出的异常来查找它们都是不好的做法(非数字字符串不是“特例”),并且可能会导致性能问题。 – 2010-08-17 21:41:54

+0

这是真的。这取决于使用场景。 – 2010-08-18 09:32:26

在String中有一个数字通常是一个坏主意。如果你想使用这个数字,然后解析它并将其用作数字。您不需要“检查”它是否是数字,或者您想将它用作数字。

如果你需要将其转换,那么你可以使用从Integer.parseInt(String)每一个解析器BigDecimal(String)

如果你只需要检查的内容可以被看作是一个数字,那么你可以逃脱正则表达式。

如果您的字符串可以包含浮点数,请不要使用parseInt。

+0

通常情况下,如果有人正在寻找一个isNumeric方法,他们血腥的并没有把穷人编号放入字符串本身;) – Jostikas 2017-03-29 04:51:21

你看过使用StringUtils library? 有一个isNumeric()函数可能是你正在寻找的。 (请注意,“”将被评估为真)

+0

Commons是数字函数只查找整数 - 它将拒绝,例如,包含一个数字小数点,当然不接受科学记数法。看到我的答案为不同的Commons功能,似乎更接近您正在寻找。 – 2010-08-17 21:47:09

+0

@JacobM:的确,当我看到您的评论时,我看到了这个NumberUtils,并且正在更新我的答案。 – 2010-08-17 21:51:59

(可选)您也可以使用正则表达式。

if (theString.matches("((-|\\+)?[0-9]+(\\.[0-9]+)?)+"))) 
    return true; 

    return false; 
+0

最后一个'+'?'“-7.0-4.2”是什么结果将返回true。 – Doug 2010-08-17 22:28:49

在强类型语言中,泛型isNumeric(String num)方法不是很有用。 13214384348934918434441是数字,但不适合大多数类型。许多那些合适的人不会返回相同的价值。

正如Colin指出的,不建议在携带应用程序的字符串中携带数字。 isNumberic函数只能用于接口方法的输入数据。这些应该有比数字更精确的定义。其他人提供了各种解决方案正则表达式可用于一次测试多个条件,包括字符串长度。

只需使用 IF((X的instanceof号)

//如果检查解析的数也

||(X的instanceof字符串& & x.matches(“(( - | \ +)?[0-9] +(\。[0-9] +)?)+“))

){ ... }
// ---所有数字类型,包括延伸的BigDecimal号码