【问题标题】:How to convert a float string to an integer in python 3如何在python 3中将浮点字符串转换为整数
【发布时间】:2015-01-18 20:20:06
【问题描述】:

我是整个编码方面的新手……所以就这样吧。 只是想写一个简单的猜数字游戏,还要做输入验证。所以只接受整数作为输入。我已经想出了如何清除字母字符,所以我可以将数字转换为整数。输入浮点数时遇到问题。我无法将浮点数转换为整数。任何帮助表示赞赏。正如我所说,我在这个编码的第 3 天,所以试着理解我的小知识。提前致谢。

这是我的主程序中的函数。

def validateInput():
    while True:
        global userGuess
        userGuess = input("Please enter a number from 1 to 100. ")
        if userGuess.isalpha() == False:
            userGuess = int(userGuess)
            print(type(userGuess), "at 'isalpha() == False'")
            break
        elif userGuess.isalpha() == True:
            print("Please enter whole numbers only, no words.")
            print(type(userGuess), "at 'isalpha() == True'")
    return userGuess

如果我使用 4.3(或任何浮点数)作为输入,则会出现以下错误。

Traceback (most recent call last):
File "C:\\*******.py\line 58, in <module>
validateInput()
File "C:\\*******.py\line 28, in validateInput
userGuess = int(userGuess)
ValueError: invalid literal for int() with base 10: '4.3'

【问题讨论】:

  • 您可以尝试使用 try-except 链接您的转化。如果您的 int() 转换产生 ValueError 异常,您可以尝试使用 float() 转换输入,然后将浮点值舍入或截断为整数。
  • 一些旁注:你几乎不想检查if spam == False:,只是if not spam:。在elif 中,您无需重新检查与if 测试相反的结果——您已经知道 isalpha 为真,因为您知道它不是假的。所以,只需使用else:。如果你从这个函数返回userGuess,你几乎肯定不需要它是global。最后,您不需要break 只需点击return;你可以直接在if 块中return userGuess

标签: python python-3.x data-conversion floating-point-conversion


【解决方案1】:

您可以使用字符串操作和类型转换。

int(userGuess.split('.')[0])

【讨论】:

    【解决方案2】:

    实际上int() 函数需要一个整数字符串浮点数,而不是浮点数字符串。如果给出一个浮点字符串,您需要先将其转换为float,然后再转换为int

    int(float(userGuess))
    

    【讨论】:

      【解决方案3】:

      不要使用isalpha 屏蔽输出。 EAFP -- 转换它并处理该异常。 ValueError 正是您想要的,因为您可以处理它并告诉用户更正他们的输入。或者出于某种奇怪的原因,您想默默地将他们的输入从“4.3”更正为“4”。

      def validateInput():
          while True:
              global userGuess
              userGuess = input("Please enter a number from 1 to 100. ")
              try:
                  int(userGuess)
                  return userGuess # you shouldn't really keep this string...
              except ValueError as e:
                  print("Please enter whole numbers only, no words.")
      

      【讨论】:

        【解决方案4】:

        首先,您为什么想要将浮点字符串转换为整数?您想将4.7 视为用户猜到4 的意思吗?还是5?还是合法但自动无效的猜测?或者实际上是 4.7 的值(在这种情况下,您根本不需要整数)?还是……?


        其次,你处理这个问题的方式是错误的。 userGuess.isalpha() 只告诉你猜测完全是由字母组成的。这意味着您仍要将"Hello!" 视为一个数字,因为它至少有一个非字母。

        如果你想知道一个字符串是否是一个有效的整数,只需在它上面调用int,然后使用try/except来处理它不是的情况:

        def validateInput():
            while True:
                global userGuess
                userGuess = input("Please enter a number from 1 to 100. ")
                try:
                    userGuess = int(userGuess)
                    print(type(userGuess), "after int succeeeded")
                    break
                except ValueError:
                    print("Please enter whole numbers only, no words.")
                    print(type(userGuess), "after int failed")
            return userGuess
        

        如果您想以不同于其他类型故障的方式处理实际单词,例如,以便打印更具体的错误消息,则可以检查 except 子句中的 isalpha

        如果你想处理检查它是否是一个浮点数以便你可以给出一个不同的错误,做同样的事情——try 调用float(userGuess)——在except 子句中。或者,如果您想截断浮点数,请将 int(userGuess) 更改为 int(float(userGuess))

        即使在 try 部分内,您也可能需要一些其他检查。例如,如果他们输入-23178 会怎样?这些是整数,但它们不是 1 到 100 之间的数字。

        显然,您想要的验证越多,需要的代码就越多,因为每个测试都是另一行代码。因此,您可能需要考虑将验证从循环输入移到一个单独的函数中,以使其更具可读性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-29
          • 2011-11-25
          • 2019-07-03
          • 2011-01-28
          • 1970-01-01
          相关资源
          最近更新 更多