PHP简易计算器开发:如何识别单个数字含多小数点的无效输入
嘿,这个坑我之前踩过!直接统计整个表达式里的小数点总数肯定行不通——毕竟像1.23 + 4.56这种合法表达式本来就有多个小数点。核心思路应该是单独检查每一个独立的数字部分,确保每个数字里最多只有一个小数点。下面给你两种实用的解决方案:
方法一:用正则表达式匹配合法数字
先定义一个能匹配所有合法数字(整数、小数,可选正负号)的正则,然后把表达式拆分成独立的数字部分,逐个验证是否符合规则。
正则说明
这里用的正则能覆盖绝大多数合法数字场景:^[-+]?(\d+\.?\d*|\.\d+)$
[-+]?:允许数字带正负号(可选)\d+\.?\d*:匹配整数(如123)或带小数的整数(如123.或123.45)\.\d+:匹配以小数点开头的小数(如.45)
代码示例(Python)
import re def is_valid_calculator_input(expr): # 先清除表达式里的空格 clean_expr = expr.replace(" ", "") # 定义合法数字的正则规则 valid_num_pattern = re.compile(r'^[-+]?(\d+\.?\d*|\.\d+)$') # 按运算符分割出所有数字部分(过滤掉空字符串,处理开头带正负号的情况) num_parts = [part for part in re.split(r'[-+*/]', clean_expr) if part] # 逐个验证数字部分 for num in num_parts: if not valid_num_pattern.match(num): return False # 额外补充:检查是否有连续运算符(如"12++34"这种非法情况) if re.search(r'[-+*/]{2,}', clean_expr): return False return True # 测试案例 print(is_valid_calculator_input("12.34.56.788")) # 输出 False print(is_valid_calculator_input("1.2354 + 5.454 + 56.645")) # 输出 True print(is_valid_calculator_input(".5 + 3.")) # 输出 True(如果允许这种格式的话) print(is_valid_calculator_input("12++34")) # 输出 False
方法二:遍历字符逐段检查
如果不想用正则,也可以通过遍历表达式的每个字符,跟踪当前是否处于一个数字片段中,以及该片段是否已经出现过小数点。
代码示例(Python)
def is_valid_calculator_input(expr): clean_expr = expr.replace(" ", "") in_number = False # 标记当前是否在一个数字片段里 has_decimal = False # 标记当前数字片段是否已经有小数点 for char in clean_expr: if char.isdigit(): in_number = True elif char == ".": # 如果不在数字片段里,或者已经有小数点,直接判定无效 if not in_number or has_decimal: return False has_decimal = True elif char in "+-*/": # 遇到运算符,重置数字片段的标记 in_number = False has_decimal = False else: # 出现非数字、非运算符、非小数点的非法字符 return False # 最后检查表达式是否以数字结尾(避免"12+"这种非法情况) return in_number # 测试案例 print(is_valid_calculator_input("12.34.56.788")) # 输出 False print(is_valid_calculator_input("1.2354 + 5.454 + 56.645")) # 输出 True print(is_valid_calculator_input("12+")) # 输出 False
这两种方法都能精准区分“多个合法小数”和“单个数字里多小数点”的情况,你可以根据自己的开发语言和需求选择适配。
内容的提问来源于stack exchange,提问作者user6914610
相关产品推荐
相关产品推荐

