Java统计字符串数据类型时Float.parseFloat误判整数如何解决
问题背景
需求为统计输入字符串中包含的字符串、int、float三类数据的数量,原有实现通过Float.parseFloat()、Integer.parseInt()方法做类型校验:其中Integer.parseInt()运行逻辑正常,但Float.parseFloat()会将整数也判定为浮点数,导致浮点数计数错误。
- 测试输入字符串:
Hello my 50 name 4.5 is James, I 20 years old and I have 5.7 coins
- 当前程序错误输出:
Float 4 Int 2 String 12
实际有效浮点数仅4.5、5.7共2个,50、20两个整数被误统计为浮点数。
原有实现代码
public class TypeCountString { public static void countTypeInString(String string){ String[] value = string.split(" "); float ifFloat; int ifInt; String ifString; int counter = 0; // count Floats for (String i: value){ try{ ifFloat = Float.parseFloat(i); counter++; continue; } catch (NumberFormatException e){ } } System.out.println("Float " + counter); //count ints counter = 0; for (String i: value){ try{ ifInt = Integer.parseInt(i); counter++; continue; } catch (NumberFormatException e){ } } System.out.println("Int " + counter); //counts strings String stringOfStrings = string.replaceAll("[0-9.]",""); stringOfStrings = stringOfStrings.replaceAll(" "," "); String[] value2 = stringOfStrings.split(" "); System.out.println("String " + value2.length); } public static void main(String[] args) { String string = "Hello my 50 name 4.5 is James, I 20 years old and i have 5.7 coins"; System.out.println(string); countTypeInString(string); } }
问题根因
原有逻辑存在两处明显缺陷:
- 浮点数判断逻辑仅依赖
Float.parseFloat()的解析结果,而整数格式的字符串本身符合浮点数解析规则,会被直接判定为浮点数,造成重复计数 - 三类数据分三次遍历统计,字符串计数依赖正则替换,逻辑冗余且容易出现边界计数错误
修复方案
调整判断逻辑,单次遍历拆分后的所有分词,按整数优先、浮点数次之、最后判定字符串的优先级做类型匹配,从根源避免重复计数:
- 优先尝试用
Integer.parseInt()解析,解析成功则int计数+1,直接进入下一个分词判断 - 解析整数失败后,先判断当前分词是否包含小数点
.,包含的前提下再尝试用Float.parseFloat()解析,解析成功则float计数+1,进入下一个分词判断 - 以上两类都不匹配的分词,直接判定为字符串,string计数+1
修复后完整代码:
public class TypeCountString { public static void countTypeInString(String string){ String[] tokens = string.split(" "); int floatCount = 0; int intCount = 0; int stringCount = 0; for (String token : tokens) { // 优先匹配整数类型 try { Integer.parseInt(token); intCount++; continue; } catch (NumberFormatException ignored) {} // 再匹配浮点数:必须包含小数点且可正常解析为浮点数 if (token.contains(".")) { try { Float.parseFloat(token); floatCount++; continue; } catch (NumberFormatException ignored) {} } // 其余均为字符串类型 stringCount++; } System.out.println("Float " + floatCount); System.out.println("Int " + intCount); System.out.println("String " + stringCount); } public static void main(String[] args) { String string = "Hello my 50 name 4.5 is James, I 20 years old and i have 5.7 coins"; System.out.println(string); countTypeInString(string); } }
修复后运行输出符合预期:
Hello my 50 name 4.5 is James, I 20 years old and i have 5.7 coins Float 2 Int 2 String 12
注:如果需要兼容带小数点但末尾无小数位的格式(如
50.)或科学计数法浮点数,可在浮点数判断逻辑中补充对应规则即可。
内容的提问来源于stack exchange,提问作者AD17
相关产品推荐
相关产品推荐

