【问题标题】:How can I determine if user input is a valid hexadecimal number?如何确定用户输入是否为有效的十六进制数?
【发布时间】:2012-03-12 18:23:06
【问题描述】:
#Hex Check
def Check():
    while False:
        for char in UserInput:
            if char not in Valid:
                print ('That is an invalid hex value.')
        print('That is a valid hex value.')
        return Check

UserInput=input('Enter a hex number: ')
Valid='1''2''3''4''5''6''7''8''9''10''A''B''C''D''E''F'

编辑:我试过这个。当我输入一个十六进制值时,例如B2 没有消息出现。

【问题讨论】:

  • 没有无效的十六进制数字组合,就像没有无效的十进制数字组合一样。您只需检查用户输入中的所有字符是否都是集合 {0-9, A-F} 的成员
  • 你的代码不起作用的原因是因为你的Check()函数从未被调用过。
  • 我可以在打印声明中调用它吗?
  • 准确地说明你想让你的脚本做什么。您是否希望用户输入一个值并告诉用户它是否是有效的十六进制数?您是否希望程序一直询问直到收到有效的十六进制数字?
  • 您已经在 check() 中有打印语句,因此没有必要。只需在`UserInput = ..., or if you plan on doing something with the user input after the check, insert someVariable = Check()`之后插入行Check()

标签: python


【解决方案1】:

将第 6 行改为

Hex=int(input('Enter a hex number: '), 16)

此行将成功解析任何十六进制输入(例如,'0x123f'),并会在无效输入(例如'hello')上抛出 ValueError。

ETA:根据您的 cmets,您只需要以下内容:

user_input = input('Enter a hex number: ')
try:
    hexval = int(user_input, 16)
    print 'That is a valid hex value.'
except:
    print 'That is an invalid hex value.'

ETA:如果你真的需要一个Check 函数,这个结构将是最好的方法:

import re

def Check(s):
    """Check if a string is a valid hexadecimal number"""
    # code for checking if it is a valid hex number here

user_input = raw_input("Enter a hex number: ")
if Check(user_input):
    print 'That is a valid hex value.'
else:
    print 'That is an invalid hex value.'

由于这是一个家庭作业问题我不会完成答案——只要知道Check 函数必须在字符串是有效的十六进制语句时返回 True,如果是字符串不是。

每个人的答案中有很多关于如何做到这一点的想法,您确实可以像我上面那样使用 try/except 语句。最好的方法之一是使用regular expressions,这是一种非常强大的字符串解析方法。

【讨论】:

  • 如果问题特别要求十六进制数字,我会在对int() 的调用中明确使用基址16
  • 我使用更新版本的python,它不使用原始输入,只输入
  • 并且在运行它时,除非我输入 Check(),否则不会出现任何输入消息
  • 当然,我把它改成了输入法。我不明白您的第二条评论-您的意思是当您在解释器中运行它时?当然,这种行为只会在您运行 Check() 函数时发生。
  • 好答案,不知道int()的这个功能。 +1
【解决方案2】:

研究正则表达式库。或者对 int 进行显式转换,然后捕获任何错误并相应地处理它们。

【讨论】:

    【解决方案3】:

    十六进制字符串的唯一有效值是 0-9, A-F 。应该可以将这些值存储在列表/数组中,然后进行简单的包含调用。类似这样的东西:

      for char in userInput:  
          if not char in validTokens:  
              print 'invalid hex value'
    

    【讨论】:

    • 开头的 0x 呢?
    • 用户不应该提供它。
    • 我用过类似的东西,虽然我把“if not char in”改成了“if char not in”,因为这在英语中听起来更合乎逻辑,但它正确吗?
    【解决方案4】:

    这是一种很好的 Python 方法来检查您输入的有效十六进制数。

    def Check():
        while not Valid:
            try:
                Hex=int(raw_input('Enter a hex number: '), 16)
                print('That is valid.')
                return True
            except ValueError:
                print('That is an invalid entry.')
                return False
    

    【讨论】:

      【解决方案5】:

      我从 Python 哲学的角度来回答这个问题,因为您已经收到了很好的答案,其中一些涉及到try: .. except

      使用异常处理try: .. except 的 Python 风格似乎是鼓励 Python 程序员使用它的方式,至少对我而言,这与其他语言的异常处理不同。

      在 Python 中,鼓励您引发异常,无论是显式使用 raise,还是在 try .. except 的构造中更隐式地使用。

      当我不久前提出一个关于如何处理 .csv 文件中的空整数值的问题时,我被鼓励继续在 try: .. 中为 Python 整数变量赋值,而不是先测试测试该值是否为空。

      答案继续说不要费心测试然后采取行动,使用异常处理,因为它更 Pythonic。使用 try: .. except 似乎也消耗了更少的指令。

      这种态度让我编写了比使用 try: .. except 更多的异常处理代码。

      【讨论】:

        【解决方案6】:

        表达式 string.translate(x, None, "0123456789abcdefABCDEF") == '' 如果 x 包含有效的十六进制字符,或者 x 是空字符串,则为真。(您需要“导入字符串”。) 显然,这可用于验证字符串是否仅包含任何给定集合中的字符(或为空)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-21
          • 2015-04-17
          • 2014-03-19
          相关资源
          最近更新 更多