-
繁星coding
带着阿帕奇公域朗3.5及以上:NumberUtils.isCreatable或StringUtils.isNumeric.带着阿帕奇公域朗3.4及以下:NumberUtils.isNumber或StringUtils.isNumeric.您也可以使用StringUtils.isNumericSpace返回true对于空字符串,并忽略字符串中的内部空格。另一种方法是使用StringUtils.isParsable根据Java,它基本上检查数字是可解析的。
-
繁花不似锦
这通常是用一个简单的用户定义的函数(即滚动你自己的“isNDigic”函数)来完成的。类似于:public static boolean isNumeric(String str) {
try {
Double.parseDouble(str);
return true;
} catch(NumberFormatException e){
return false;
} }但是,如果您经常调用这个函数,并且您希望许多检查由于不是一个数字而失败,那么这个机制的性能就不会很好,因为您依赖于每次失败都抛出异常,这是一个相当昂贵的操作。另一种方法可能是使用正则表达式检查数字的有效性:public static boolean isNumeric(String str) {
return str.matches("-?\\d+(\\.\\d+)?"); //match a number with optional '-' and decimal.}不过,请注意上面的RegEx机制,因为如果您使用的是非阿拉伯数字(即从0到9以外的数字),它将失败。这是因为RegEx的“\d”部分将只与[0-9]相匹配,而且实际上并不是国际上所知的。(感谢俄勒冈幽灵指出这一点!)甚至另一种选择是使用Java的内置java.text.NumberFormat对象来查看解析字符串后解析器的位置是否位于字符串的末尾。如果是,我们可以假设整个字符串是数字的:public static boolean isNumeric(String str) {
NumberFormat formatter = NumberFormat.getInstance();
ParsePosition pos = new ParsePosition(0);
formatter.parse(str, pos);
return str.length() == pos.getIndex();}
-
九州编程
如果您使用的是Android,那么您应该使用:android.text.TextUtils.isDigitsOnly(CharSequence str)保持简单。大多数情况下,每个人都可以“重新编程”(同样的事情)。
-
HUX布斯
对于使用异常测试字符串是否为数字,我也有类似的性能考虑。因此,我最终拆分字符串并使用java.lang.Character.isDigit().public static boolean isNumeric(String str){
for (char c : str.toCharArray())
{
if (!Character.isDigit(c)) return false;
}
return true;}根据Javadoc, Character.isDigit(char)将正确识别非拉丁数字。就性能而言,我认为简单的N个比较(其中N是字符串中的字符数)比执行正则匹配更具有计算效率。更新:正如Jean-Fran ois Corbett在评论中指出的,上述代码只验证正整数,这涵盖了我的大部分用例。下面是根据系统中使用的默认区域设置正确验证小数的更新代码,假设小数分隔符只在字符串中出现一次。public static boolean isStringNumeric( String str ){
DecimalFormatSymbols currentLocaleSymbols = DecimalFormatSymbols.getInstance();
char localeMinusSign = currentLocaleSymbols.getMinusSign();
if ( !Character.isDigit( str.charAt( 0 ) ) && str.charAt( 0 ) != localeMinusSign ) return false;
boolean isDecimalSeparatorFound = false;
char localeDecimalSeparator = currentLocaleSymbols.getDecimalSeparator();
for ( char c : str.substring( 1 ).toCharArray() )
{
if ( !Character.isDigit( c ) )
{
if ( c == localeDecimalSeparator && !isDecimalSeparatorFound )
{
isDecimalSeparatorFound = true;
continue;
}
return false;
}
}
return true;}