如何在不使用try / except的情况下检查字符串是否可以转换为浮点数或整数值?

如何解决如何在不使用try / except的情况下检查字符串是否可以转换为浮点数或整数值?

我有第一年编程课的作业,其中一部分是将字符串转换为整数或浮点值。但是,如果字符串不可转换,则应将None值传递给变量。我的教授指出,无论出于何种原因,我们都不允许使用try / except,而且我可以想到的唯一方法是使用isdigit()方法,但是,对于需要负值的值,这是行不通的,因为该值是用于温度。

temp = input('What is the temperature value? Enter a numeric value: ')

try: 
   temp = float(input('What is the temperature value? Enter a numeric value: '))
except ValueError:
   temp = None

这是我想到的唯一方法,但是,我班上的另一个学生在我们应该定义的先前功能之一中使用is digit()做到了

def convert_to_kelvin(temperature,units):
    unit = units.lower()
    if type(temperature) != float and type(temperature) != int and temperature.isdigit() == False:
   return None

使用此方法,教授使用的自动分级机将其标记为正确,并且也将我的try / except标记为正确。但是我的同学代码没有给出负值,而我的则没有。教授说不允许使用try / except。

解决方法

所以这是我的尝试,我不知道它是否真的适用于所有情况,但据我测试:

allowed_chars = '1234567890.-'

temp = input('Input temp: ')

def check():
    not_int = False
    for chars in temp:
        if chars not in allowed_chars or temp[-1] == '.' or temp[-1] == '-':
            not_int = True
        else:
            not_int = False
    return temp if not not_int else None

print(check())

现在,您必须自己了解它的作用,因为您可能需要向您的老板解释它

,

一种确定此方法的方法是尝试进行转换以查看是否可以成功完成转换。无法使用异常会使任务难以完成,这令人惊讶,因为它需要在内部使用许多标记变量。就是说,我认为这涵盖了大多数(即使不是全部)可能性。

这是该方法的弱点,因为存在大量无效的可能输入,而有效输入则相对较少。

from string import digits  # '0123456789'


def parse_numeric(string):
    """ Parse a string into an integer or float if possible and return it,otherwise return None.
    """
    if not string:  # Empty string?
        return None
    decimal_point = None
    neg = False
    if string.startswith('-'): # minus sign?
        string = string[1:]  # Remove it.
        neg = True

    res = 0
    for ch in string:
        if ch == '.':  # Decimal point?
            if decimal_point is not None:
                return None  # Invalid,one already seen.
            else:
                decimal_point = 0  # Initialize.
                continue

        if ch not in digits:
            return None  # Invalid.
        if decimal_point is not None:
            decimal_point += 1
        res = res*10 + ord(ch) - ord('0')

    if decimal_point is not None:
        res = res / 10**decimal_point
    return res if not neg else -res


if __name__ == '__main__':

    testcases = ('1','12','123','123.','123.4','123.45','-1','-12','-123','-123.','-123.4','-123.45','1-','-1-2','123-4.5','foobar','-woot')

    for temp in testcases:
        print(f'input: {temp!r:>10},result: {parse_numeric(temp)}')

输出:

input:        '1',result: 1
input:       '12',result: 12
input:      '123',result: 123
input:     '123.',result: 123.0
input:    '123.4',result: 123.4
input:   '123.45',result: 123.45
input:       '-1',result: -1
input:      '-12',result: -12
input:     '-123',result: -123
input:    '-123.',result: -123.0
input:   '-123.4',result: -123.4
input:  '-123.45',result: -123.45
input:       '1-',result: None
input:     '-1-2',result: None
input:  '123-4.5',result: None
input:   'foobar',result: None
input:    '-woot',result: None

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-