Java:数字验证

news2024/9/22 21:36:19

Java中的有效数字验证:从混乱到清晰

  • 引言
    • 问题背景
        • 初始尝试:一段令人困惑的代码
        • 解决方案:简化与重构
  • 结语

引言

在计算机科学领域,确保输入数据的有效性至关重要。

尤其在处理用户提交的数据或解析文本文件时,确认数据格式的准确性变得尤为关键。

本次讨论的焦点是利用Java语言检测一个字符串是否能够被识别为有效的数字,这包括了整数、小数以及采用科学记数法表示的数字。

我们将从一段具有挑战性的初始代码开始,逐步分析存在的问题,并最终开发一个简洁高效的解决方案。
检测有效数字,处理用户数据,分析问题

问题背景

在开发一个应用程序时,你可能会遇到需要用户输入数字的场景。

这些数字可以是各种形式的:整数、小数或是科学记数法表示的数值,比如 3.14 或 1.23e10。

为了确保程序的正确性,你需要实现一个函数来检验用户输入的数值是否符合要求。

初始尝试:一段令人困惑的代码

让我们先来看一段尝试解决这个问题的代码片段:

class Solution {
    char[] chars;
    boolean point = false;
    boolean exponent = false;

    public boolean isNumber(String s) {
        s = s.trim();
        int length = s.length();
        if (length == 0) {
            return false;
        }
        chars = s.toCharArray();
        String[] ss = s.split("e|E");
        if (ss.length > 2) {
            return false; // 不允许有多个'e'或'E'
        }
        if (ss.length == 1) { // 没有指数部分
            return isNumberPart(0, length);
        } else {
            // 有指数部分
            exponent = true;
            return isNumberPart(0, ss[0].length()) && isExponentPart(ss[0].length() + 1, length);
        }
    }

    private boolean isNumberPart(int start, int end) {
        if (start >= end) {
            return false;
        }
        if (chars[start] == '+' || chars[start] == '-') {
            start++;
        }
        if (start == end) {
            return false;
        }
        for (int i = start; i < end; i++) {
            if (chars[i] == '.') {
                if (point) {
                    return false; // 只允许有一个小数点
                }
                point = true;
                continue;
            }
            if (chars[i] < '0' || chars[i] > '9') {
                return false;
            }
        }
        return true;
    }

    private boolean isExponentPart(int start, int end) {
        if (start == end) {
            return false;
        }
        if (chars[start] == '+' || chars[start] == '-') {
            start++;
        }
        if (start == end) {
            return false;
        }
        for (int i = start; i < end; i++) {
            if (chars[i] < '0' || chars[i] > '9') {
                return false;
            }
        }
        return true;
    }
}

这段代码乍一看似乎能够解决问题,但它存在几个明显的问题:

  1. 复杂性:代码结构复杂,不易于理解和维护。
  2. 逻辑错误:某些情况下可能会给出错误的结果。
  3. 性能问题:多次字符串分割和字符数组操作可能导致性能下降。
解决方案:简化与重构

为了让代码更加清晰易懂,并且能够高效地解决问题,我们对这段代码进行了重构。以下是重构后的代码:

class Solution {
    public boolean isNumber(String s) {
        s = s.trim();
        if (s.isEmpty()) return false;
        boolean hasDot = false, hasE = false, hasDigit = false;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (Character.isDigit(c)) {
                hasDigit = true;
            } else if (c == '.' || c == 'e' || c == 'E') {
                if (c == '.' && hasDot) return false;
                if ((c == 'e' || c == 'E') && (hasE || !hasDigit)) return false;
                hasDot = (c == '.');
                hasE = (c == 'e' || c == 'E');
                hasDigit = false; // 重置hasDigit,因为在'e'之后必须要有数字
            } else if (c == '+' || c == '-') {
                if (i != 0 && s.charAt(i - 1) != 'e' && s.charAt(i - 1) != 'E') return false;
            } else {
                return false;
            }
        }
        return hasDigit && !hasE || hasDigit && hasE;
    }
}

在这段代码中,我们做了以下几点改进:

  1. 简化逻辑:使用布尔变量来跟踪小数点、指数符号以及数字的存在状态。
  2. 增强可读性:代码结构更加清晰,易于理解和调试。
  3. 提高性能:避免了不必要的字符串分割和字符数组操作。

结语

通过此次代码重构,我们不仅提升了代码的可读性和维护性,也确保了其准确性与效率。
代码重构,提升可读性维护性,确保准确性效率,持续改进,追求代码之美

在软件开发过程中,不断地检查和改进代码是一项持续的任务。

希望这次重构的经历能够为大家提供一些启示,助力编写出更加优雅和高效的代码。

无论是刚入门的新手还是资深的开发者,我们都应该始终保持学习的态度,追求代码之美。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2097222.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二证券:大洗牌!头部券商营收、净利集体下滑

前十券商营收团体下滑&#xff0c;银河证券跌幅最小 新股IPO数量锐减129家至44家&#xff0c;国内证券市场股票基金交易量日均规划 同比下降 6.83%……关于证券公司而言&#xff0c;本年上半年可谓多重要素叠加冲击&#xff0c;成果下滑难以避免。于大多数证券公司而言&#x…

金融行业选择数据安全交换系统三定律,你遵从了没?

金融行业对我国的重要性不言而喻&#xff0c;它作为国民经济的血脉&#xff0c;是国家核心竞争力的重要组成部分。金融行业是数据密集型行业&#xff0c;数据是金融行业的重要资产。数据在金融行业内部及内外部流动时&#xff0c;其价值才得以发挥&#xff0c;金融行业的业务以…

在麒麟系统安装php7.4中遇到的问题

一、安装过程 下载相关php安装包&#xff0c;进行解压&#xff0c;进入安装包&#xff0c;进行编译安装&#xff0c;编译 ./configure --prefix/soft/php74 --with-config-file-path/soft/php74/etc --with-libdir/usr/lib64 --with-freetype/usr/include/freetype2/free…

Zynq7000系列FPGA中的DDRC纠错码(ECC)

仅在半总线宽度&#xff08;16位&#xff09;数据宽度配置中提供可选的ECC支持。这种配置下&#xff0c;外部DRAM DDR设备需要26位&#xff0c;其中16位用于数据&#xff0c;10位用于ECC。每个数据字节使用独立的5位ECC字段&#xff0c;这种模式提供了单错误纠正和双错误检测的…

【C++】vector迭代器失效问题

本文是对vector迭代器失效问题的分析&#xff0c;需要对vector有一定了解&#xff0c;若还不了解的可以看这篇文章进行学习&#xff1a;【C】容器vector常用接口详解-CSDN博客 目录 一.什么是迭代器失效&#xff1f; 二.迭代器失效的典型案例 1.引起底层空间改变 2.指定位置…

Docker 在 Windows 上的使用指南

Docker 在 Windows 上的使用指南 Docker 是一种强大的容器化平台&#xff0c;广泛应用于开发和生产环境。本文将介绍如何在 Windows 系统上使用 Docker&#xff0c;包括容器的启动、常见问题的排查&#xff0c;以及网络问题的解决方法。 1. Docker 安装与配置 在开始使用 Do…

大模型书单指南:如何快速找到最适合你的那一本书?别找了就是这本!

大模型的书这么多&#xff0c;该怎么选呢&#xff1f; 本期书单就来教大家怎么快速地从众多大模型书中选到你想要的那一本&#xff01; 大模型基础 大模型入门不可错过的一本书&#xff0c;就是这本大模型界的经典畅销书**《大规模语言模型》**&#xff01;系统性强&#xf…

如何从 Mac 上清空的垃圾箱中恢复误删除的文件

在 Mac 上删除的文件将被移至垃圾箱并保留 30 天&#xff0c;然后才会被永久删除。但是&#xff0c;许多 Mac 用户可能会意外清空垃圾箱而没有意识到其中包含了重要文件。本指南包含从清空的垃圾箱中恢复 Mac 上已删除文件的所有有效方法。 当您意识到自己意外清空了 Mac 上的…

C语言基础(三十一)

1、线性搜索&#xff1a; #include "date.h" #include <stdio.h> #include <stdlib.h> #include <time.h> // 希尔排序 void shellSort(int arr[], int n) { for (int gap n / 2; gap > 0; gap / 2) { for (int i gap; i < n; i…

vue学习记录十四:路由(router)学习(五):Vue Router基本原理实现第二种方法

vue学习记录十四&#xff1a;路由&#xff08;router&#xff09;学习&#xff08;四&#xff09;&#xff1a;Vue Router基本原理实现二 一、vueRouter目录结构二、模拟vueRouter目录结构三、index.js文件实现四、install.js文件实现五、创建组件六、解析路由规则七、match实现…

浅谈人工智能之基于anaconda的AutoGen Studio环境搭建

浅谈人工智能之基于anaconda的AutoGen Studio环境搭建 AutoGen Studio 是一个基于 AutoGen 框架的图形用户界面&#xff08;GUI&#xff09;工具。它使开发人员能够更轻松地创建和管理多智能体应用&#xff0c;而无需编写代码。AutoGen Studio 提供了拖放式界面和各种预构建模…

绿色革命:‘众店‘如何重塑零售业并引领消费新潮流

在数字化浪潮的推动下&#xff0c;传统零售业正面临深刻的变革。在这一过程中&#xff0c;绿色积分系统作为一种创新的消费模式&#xff0c;逐渐成为市场的新宠。 一、"众店"平台的迅猛发展 "众店"平台仅用两年时间就实现了跨越式发展&#xff0c;交易额突…

JS基础【双重for循环的实现与应用、打印九九乘法表】

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主、华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f970; &#…

springboot+MySQL流浪猫狗疾病预约救治系统-计算机毕设 附源码 13676

springboot流浪猫狗疾病预约救治系统 摘 要 现如今在中国&#xff0c;随着人民生活质量的逐渐提高&#xff0c;以及人民群众消费能力的日渐增长&#xff0c;各种各样的家养小动物&#xff0c;已经逐渐成为人类越来越亲密的生活伴侣。并且&#xff0c;现如今社会竞争及其激烈&am…

钢铁百科:A633D交货状态、A633D对应牌号、A633D力学性能解析

A633D钢板是一种美标低合金高强度结构钢板&#xff0c;也被称为A633GrD钢板&#xff0c;其执行标准为ASTM/A633M。这种钢板以其高屈服强度、良好的韧性、抗腐蚀性和耐疲劳性而著称&#xff0c;广泛应用于建筑、桥梁、船舶、汽车、铁路、重型机械及矿山机械等多个领域。 一、A6…

【CSS】如何写渐变色文字并且有打光效果

效果如上&#xff0c;其实核心除了渐变色文字的设置 background: linear-gradient(270deg, #d2a742 94%, #f6e2a7 25%, #d5ab4a 48%, #f6e2a7 82%, #d1a641 4%);color: #e8bb2c;background-clip: text;color: transparent;还有就是打光效果&#xff0c;原理其实就是两块遮罩&am…

微信小程序知识点(一)

1.条件判断&#xff1a; wx:if&#xff0c;wx:elif&#xff0c;wx:else 和Hidden的区别 wx:if等是动态实现组件的&#xff0c;符合条件&#xff0c;页面上就新增一个组件&#xff0c;不符合&#xff0c;就会在也页面上加载&#xff0c;而Hidden只是控制页面的组件的显示与否&…

C#绘制常用工业控件(仪表盘,流动条,开关等)

目录 1&#xff0c;使用Graphics绘制Toggle。 效果&#xff1a; 测试代码&#xff1a; Toggle控件代码&#xff1a; 2&#xff0c;使用Graphics绘制Switch。 效果&#xff1a; 测试代码&#xff1a; Switch控件代码&#xff1a; 3&#xff0c;使用Graphics绘制PanelHe…

【Nest 学习笔记】AOP切片编程

切片编程 AOP 把通用逻辑抽离出来&#xff0c;通过切面的方式添加到某个地方&#xff0c;可以复用和动态增删切面逻辑。 中间件 Middleware Middleware 中间件属于全局中间件&#xff08;Middleware 是 Express 的概念&#xff09; 常用于对请求接口进行日志记录 // main.ts …

七. 部署YOLOv8检测器-load-save-tensor

目录 前言0. 简述1. 案例运行2. 补充说明3. 代码分析3.1 main.cpp3.2 create_data.py 结语下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习课程第六章—部署分类器&…