web-dev-qa-db-ja.com

python 3でfloat文字列を整数に変換する方法

私はコーディング全体に不慣れです...だからここに行きます。単純な数推測ゲームを書こうとしているだけでなく、入力の検証も行います。整数のみが入力として受け入れられるようにします。数字を整数に変換できるように、アルファベット文字を取り除く方法を理解しました。フロート番号を入力すると問題が発生します。浮動小数点数を整数に変換することはできません。どんな助けでも大歓迎です。私が言ったように、私はこのコーディングの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(または任意のfloat)を入力として使用した場合に発生するエラーは次のとおりです。

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'
11
corey

実際には、int()関数は整数文字列または浮動小数点を予期しますが、浮動小数点文字列は予期しません。フロート文字列が指定されている場合は、最初にfloatに変換してから、次のようにintに変換する必要があります。

int(float(userGuess))
11
Irshad Bhat

文字列操作と型キャストを使用できます。

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

まず、なぜfloat文字列を整数に変換したいのですか? _4.7_を、ユーザーが_4_を推測したことを意味するものとして扱いますか?または_5_?または、合法だが自動的に無効な推測ですか?または、実際には値_4.7_(この場合、整数はまったく必要ありません)ですか?または…?


第二に、これにアプローチする方法が間違っています。 userGuess.isalpha()は、推測が完全に文字で行われていることを通知するだけです。つまり、少なくとも1つの非文字があるため、たとえば_"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
_

他の種類の失敗とは異なる方法で実際の単語を処理する場合、たとえば、より具体的なエラーメッセージを出力できる場合は、isalpha句内のexceptを確認できます。

別のエラーを出すことができるようにそれがfloatであるかどうかのチェックを処理したい場合は、try句内で同じこと(exceptを呼び出してfloat(userGuess))を実行します。または、floatを切り捨てる場合は、そのint(userGuess)int(float(userGuess))に変更します。

tryパーツ内でも、他のチェックが必要になる場合があります。たとえば、_-23_または_178_と入力した場合はどうなりますか?これらは整数ですが、1から100までの数値ではありません。

明らかに、各テストは別のコード行であるため、必要な検証が多いほど、必要なコードも多くなります。したがって、検証をループオーバー入力とは別の関数に移動して、読みやすくすることを検討することをお勧めします。

0
abarnert

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.")
0
Brian Cain