4 回答
TA贡献1797条经验 获得超4个赞
带着阿帕奇公域朗3.5及以上:NumberUtils.isCreatable
或StringUtils.isNumeric
.
带着阿帕奇公域朗3.4及以下:NumberUtils.isNumber
或StringUtils.isNumeric
.
您也可以使用StringUtils.isNumericSpace
返回true
对于空字符串,并忽略字符串中的内部空格。另一种方法是使用StringUtils.isParsable
根据Java,它基本上检查数字是可解析的。
TA贡献1851条经验 获得超4个赞
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.}
public static boolean isNumeric(String str) { NumberFormat formatter = NumberFormat.getInstance(); ParsePosition pos = new ParsePosition(0); formatter.parse(str, pos); return str.length() == pos.getIndex();}
TA贡献1785条经验 获得超4个赞
如果您使用的是Android,那么您应该使用:
android.text.TextUtils.isDigitsOnly(CharSequence str)
保持简单。大多数情况下,每个人都可以“重新编程”(同样的事情)。
TA贡献1876条经验 获得超6个赞
对于使用异常测试字符串是否为数字,我也有类似的性能考虑。因此,我最终拆分字符串并使用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;}
添加回答
举报