You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
}
问题根因

原有逻辑存在两处明显缺陷:

  1. 浮点数判断逻辑仅依赖Float.parseFloat()的解析结果,而整数格式的字符串本身符合浮点数解析规则,会被直接判定为浮点数,造成重复计数
  2. 三类数据分三次遍历统计,字符串计数依赖正则替换,逻辑冗余且容易出现边界计数错误
修复方案

调整判断逻辑,单次遍历拆分后的所有分词,按整数优先、浮点数次之、最后判定字符串的优先级做类型匹配,从根源避免重复计数:

  • 优先尝试用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 22:21:30