• 判断字符串是否是数字类型


    今天在判断接口收到的字符串信息是否是数字类型时使用的是org.apache.commons.lang3.StringUtils的isNumeric方法.
    在对方传来浮点型数字的时候判断为非数字型查看了源码

    通过查看每一个字符的char是否为为数字,也就是char的值是048-057,但是浮点型中有个一个".",它的char是046,所以会返回false

    找到了另外一个类,net.logstash.logback.encoder.org.apache.commons.lang.math.NumberUtil的isNumber可以判断浮点型数字

    public static boolean isNumber(String str) {
            if (StringUtils.isEmpty(str)) {
                return false;
            } else {
                char[] chars = str.toCharArray();
                int sz = chars.length;
                boolean hasExp = false;
                boolean hasDecPoint = false;
                boolean allowSigns = false;
                boolean foundDigit = false;
                int start = chars[0] == '-' ? 1 : 0;
                int i;
                if (sz > start + 1 && chars[start] == '0' && chars[start + 1] == 'x') {
                    i = start + 2;
                    if (i == sz) {
                        return false;
                    } else {
                        while(i < chars.length) {
                            if ((chars[i] < '0' || chars[i] > '9') && (chars[i] < 'a' || chars[i] > 'f') && (chars[i] < 'A' || chars[i] > 'F')) {
                                return false;
                            }
    
                            ++i;
                        }
    
                        return true;
                    }
                } else {
                    --sz;
    
                    for(i = start; i < sz || i < sz + 1 && allowSigns && !foundDigit; ++i) {
                        if (chars[i] >= '0' && chars[i] <= '9') {
                            foundDigit = true;
                            allowSigns = false;
                        } else if (chars[i] == '.') {
                            if (hasDecPoint || hasExp) {
                                return false;
                            }
    
                            hasDecPoint = true;
                        } else if (chars[i] != 'e' && chars[i] != 'E') {
                            if (chars[i] != '+' && chars[i] != '-') {
                                return false;
                            }
    
                            if (!allowSigns) {
                                return false;
                            }
    
                            allowSigns = false;
                            foundDigit = false;
                        } else {
                            if (hasExp) {
                                return false;
                            }
    
                            if (!foundDigit) {
                                return false;
                            }
    
                            hasExp = true;
                            allowSigns = true;
                        }
                    }
    
                    if (i < chars.length) {
                        if (chars[i] >= '0' && chars[i] <= '9') {
                            return true;
                        } else if (chars[i] != 'e' && chars[i] != 'E') {
                            if (chars[i] == '.') {
                                return !hasDecPoint && !hasExp ? foundDigit : false;
                            } else if (allowSigns || chars[i] != 'd' && chars[i] != 'D' && chars[i] != 'f' && chars[i] != 'F') {
                                if (chars[i] != 'l' && chars[i] != 'L') {
                                    return false;
                                } else {
                                    return foundDigit && !hasExp;
                                }
                            } else {
                                return foundDigit;
                            }
                        } else {
                            return false;
                        }
                    } else {
                        return !allowSigns && foundDigit;
                    }
                }
            }
        }
    

    内部判断了很多情况,但我其实觉得可以使用FloatingDecimal.parseDouble来转化字符串,抛出异常为非数字,成功为数字类型

  • 相关阅读:
    SpringBoot微服务电商项目开发实战 --- 模块版本号统一管理及Redis集成实现
    Spring Boot微服务电商项目开发实战 --- 多环境部署配置、端口号统一配置及Dubbo提供者消费者实现
    Spring Boot微服务电商项目开发实战 --- 基础配置及搭建
    Java开发面试题汇总 -- 精选版(附答案)
    springmvc用model传值到jsp页面,el表达式引用接收不到传递过来的值
    八、自定义starter
    七、Spring Boot 启动配置原理
    六、SpringBoot与数据访问
    五、Docker
    四、Spring Boot Web开发
  • 原文地址:https://www.cnblogs.com/gongcheng-/p/14595803.html
Copyright © 2020-2023  润新知