06-验证浮点数输入

鉴于shell脚本的限制和本事,浮点数(或“实数”)的验证过程乍一看似乎让人望而生畏,不过考虑到浮点数只不过是由小数点分隔的两个整数,再配合能够在脚本中引用其他脚本的能力(validint),你就会发现浮点数验证的代码长度出奇地短。

程序代码
#!/bin/sh
#filename:validint
#description:验证整数输入,允许出现负数。validint() {# 验证第一个参数并根据 最小值$2 和/或 最大值$3(如果指定的话)进行测试。# 如果第一个参数的值不在指定区间内或者不全是数字组成,那么脚本执行失败number="$1";    min="$2";       max="$3"# 判断输入是否为空if [ -z $number ]; thenecho "You didn't enter anything. Please enter a number." >&2return 1fi# 获取整数部分if [ "${number%${number#?}}" = "-" ]; then# 获取第一个字符以外的所有字符进行测试testvalue="${number#?}"elsetestvalue="$number"fi# 删除变量number中的所有数字,以作测试之用nodigits="$(echo $testvalue | sed 's/[[:digit:]]//g')"# 检查非数字字符if [ ! -z $nodigits ];thenecho "Invalid number format! Only digits, no commas, spaces, etc." >&2return 1fiif [ ! -z $min ];then# 输入值是否小于指定的最小值?if [ "$number" -lt "$min" ];thenecho "Your value is too small: smallest accpetable value is $min." >&2return 1fifiif [ ! -z $max ];then# 输入值是否大于指定的最大值if [ "$number" -gt "$max" ];thenecho "Your value is too big: largest acceptable value is $max." >&2return 1fifireturn 0
}
#!/bin/bash
# validfloat -- 测试数字是否为有效的浮点数
# 注意:该脚本不支持科学计数法(1.304e5)# 要测试输入的值是否为有效的浮点数,需要将值分为两个部分:整数部分和小数部分。
# 先测试第一部分是否为有效整数,然后测试第二部分是否为大于或等于0的有效整数。
# 因此 -30.-8则无效。# 使用“.”记法可以将另一个脚本包含到此脚本中:
#source /root/validint
. /root/validintvalidfloat() {fvalue="$1"# 检查输入的数字是否为有小数点if [ ! -z $(echo $fvalue | sed 's/[^.]//g') ];then# 提取小数点之前的部分decimalPart="$(echo $fvalue | cut -d. -f1)"# 提取小数点之后的部分fractionalPart="${fvalue#*\.}"# 先测试小数点左侧的整数部分。if [ ! -z $decimalPart ];then# 由于“!” 会颠倒测试逻辑,因此下面表示“如果不是有效的整数”。if ! validint "$decimalPart" "" "" ; thenreturn 1fifi# 现在测试小数部分# 小数点之后不能有负号(例如33.-11就不正确),因此先来测试负号if [ "${fractionalPart%${fractionPart#?}}" = "-" ];thenecho "Invalid floating-point number: '-' not allowed after decimal point." >&2return 1 fiif [ "$fractionalPart" != "" ];then# 如果小数部分不是有效的整数.....if ! validint "$fractionalPart" "0" "";thenreturn 1fifielse# 如果整个值只是一个“-”,那也不行if  [ "$fvalue" = "-" ];thenecho "Invalid floating-point format." >&2return 1fi# 最后,检查剩下的部分是否为有效的整数if ! validint "$fvalue" "" "" ; thenreturn 1fifireturn 0
}if validfloat $1 ; thenecho "$1 is a valid floating-point value."
fi
exit 0

工作原理

脚本首先检查输入值是否包含小数点。如果没有,那么说明不是浮点数。接下来,将输入值的整数部分和小数部分分开测试。然后在脚本检查整数部分(小数点左侧)是否有效。之后的代码就比较复杂了,因为我们需要检查有没有多余的负号(避免出现17-30这种情况),另外还要确保小数部分(小数点右侧)也是有效的整数。

最后检查用户指定的是否只是一个负号和小数点(得承认这确实挺怪异)。

如果都没有问题,脚本返回0,表示用户输入的是一个有效的浮点数。

精益求精

一个比较酷的改进是让这个函数能够处理最后一个例子中出现的科学记数法。这算不上多难,你可以先测试是否存在'e'或'E',然后将值分成3部分:整数部分(只有一个数字)、小数部分以及10的幂。剩下的事情就是确保每部分都是有效的整数。

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

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

相关文章

【爬取网易财经文章】

引言 在信息爆炸的时代,获取实时的财经资讯对于投资者和金融从业者来说至关重要。然而,手动浏览网页收集财经文章耗时费力,为了解决这一问题,本文将介绍如何使用Python编写一个爬虫程序来自动爬取网易财经下关于财经的文章 1. 爬…

前端基础 Vue -组件化基础

1.全局组件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><script src&…

【QA】MySQL导出某数据库的所有数据为sql文件,包含建库命令、建表命令。

文章目录 前言Windows系统下 | mysqldump导出数据库数据Docker中导入初始化数据【补充】通过命令行&#xff0c;执行sql文件&#xff0c;将数据导入到数据库在MySQL外面执行在MySQL中执行 前言 我们在用docker部署mysql项目的时候&#xff0c;往往需要对数据库进行数据初始化。…

Java-SSM电影在线播放系统

Java-SSM电影在线播放系统 1.服务承诺&#xff1a; 包安装运行&#xff0c;如有需要欢迎联系&#xff08;VX:yuanchengruanjian&#xff09;。 2.项目所用框架: 前端:JSP、layui等 后端:SSM,即Spring、SpringMvc、Mybatis等。 3.项目功能点: 3-1.后端功能: - 所有后台管理展…

rk3588内核添加特殊分辨率

rk平台内核本身默认支持一些常规的分辨率,如1920x1080@30,1280x720@60,但是往往不能满足需求,如有的客户需要你添加1020x700@35的分辨率,这时候就要自己加上去了。 下图是LCD各个参数对应的位置: 显示mode 各个参数含义如下: hdisplay:有效显示区水平像素数量,对应A…

Redis入门到实战-第十弹

Redis实战热身Geospatial篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、消息代…

[综述笔记]Flexible large-scale fMRI analysis: A survey

论文网址&#xff1a;Flexible large-scale fMRI analysis: A survey | IEEE Conference Publication | IEEE Xplore 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff0…

关于网格数据导出指定格式的测试(以Gmsh导出nas格式为例)

本文主要讲述Gmsh如何导出nas格式的网格数据&#xff0c;众所周知&#xff0c;Gmsh可以导出多种网格数据格式&#xff0c;比如大家熟悉的msh、stl、inp、cgns&#xff08;似乎不完善&#xff09;等等&#xff0c;但是gmsh不支持nas格式的导出&#xff0c;只支持nas格式的导入&a…

银行量子金融系统应用架构设计

量子金融&#xff08;即Financial-Quantum&#xff0c;简称Fin-Q&#xff09;&#xff0c;特指量子科技在金融行业中的应用。 目前&#xff0c;量子科技中以量子保密通信、量子随机数和量子计算发展进度较快&#xff0c;取得了诸多阶段性重大技术突破和商用成果&#xff0c;这…

Linux Ncurses库部分函数使用说明

目录 1. initscr&#xff08;&#xff09;函数 2. endwin&#xff08;&#xff09;函数 3. curs_set()函数 4.noecho()函数 5. keypad()函数 6. start_color()函数 7.init_pair()函数 8.getch()函数 9.move()函数 10.addch()函数 11. refresh()函数 12.inch()函数…

实战|使用 Node.js 和 htmx 构建全栈应用程序

在本教程中&#xff0c;我将演示如何使用 Node 作为后端和 htmx 作为前端来构建功能齐全的 CRUD 应用程序。这将演示 htmx 如何集成到全栈应用程序中&#xff0c;使您能够评估其有效性并确定它是否是您未来项目的不错选择。 htmx 是一个现代 JavaScript 库&#xff0c;旨在通过…

多叉树题目:N 叉树的前序遍历

文章目录 题目标题和出处难度题目描述要求示例数据范围进阶 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 解法三思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;N 叉树的前序遍历 出处&#xff1a;589. N 叉树的前序遍历 难度 3 级 题目…

一文速通自监督学习(Self-supervised Learning):教机器自我探索的艺术

一文速通自监督学习&#xff08;Self-supervised Learning&#xff09;&#xff1a;教机器自我探索的艺术 前言自监督学习是什么&#xff1f;自监督学习的魔力常见的自监督学习方法1. 对比学习2. 预测缺失部分3. 旋转识别4. 时间顺序预测 结语 &#x1f308;你好呀&#xff01;…

Docker新手攻略:编辑Dockerfile、构建镜像、启动容器全攻略

万能dockerfile编写模板文件 FROM openjdk:11.0 as builder WORKDIR application ARG JAR_FILEtarget/*.jar COPY ${JAR_FILE} application.jar RUN java -Djarmodelayertools -jar application.jar extractFROM openjdk:11.0 WORKDIR application COPY --frombuilder applica…

Springboot项目结构

1. 一个正常的企业项目里一种通用的项目结构和代码层级划分的指导意见&#xff1a; 一般分为如下几层&#xff1a; 开放接口层 终端显示层 Web 层 Service 层 Manager 层 DAO 层 外部接口或第三方平台 2. 以当下非常火热的Spring Boot典型项目结构为例&#xff0c;创建出…

代码随想录算法训练营第三十四天 |1005. K 次取反后最大化的数组和 、134. 加油站、135. 分发糖果

代码随想录算法训练营第三十四天 |1005. K 次取反后最大化的数组和 、134. 加油站、135. 分发糖果 1005. K 次取反后最大化的数组和题目解法 134. 加油站题目解法 135. 分发糖果题目解法 感悟 1005. K 次取反后最大化的数组和 题目 解法 考虑绝对值 class Solution { public…

真机笔记(3) 真机需求讲解

目录 拓扑分析&#xff1a; 设计理念&#xff1a; 1. 生产区交换需求&#xff1a; 2. 生产区交换需求&#xff1a; 3. 服务器区交换需求&#xff1a; 4. 路由设计 5. 地址规划&#xff1a; 拓扑分析&#xff1a; 蓝色&#xff1a;网线 红色&#xff1a;多模光纤 黄色&am…

【SpringBoot框架篇】37.使用gRPC实现远程服务调用

文章目录 RPC简介gPRC简介protobuf1.文件编写规范2.字段类型3.定义服务(Services) 在Spring Boot中使用grpc1.父工程pom配置2.grpc-api模块2.1.pom配置2.2.proto文件编写2.3.把proto文件编译成class文件 3.grpc-server模块3.1.pom文件和application.yaml3.2.实现grpc-api模块的…

2-Flume之Sink与Channel

Flume Sink HDFS Sink 将数据写到HDFS上。数据以文件形式落地到HDFS上&#xff0c;文件名默认是以FlumeData开头&#xff0c;可以通过hdfs.filePrefix来修改 HDFS Sink默认每隔30s会滚动一次生成一个文件&#xff0c;因此会导致在HDFS上生成大量的小文件&#xff0c;实际过程…