2012-02-16 22 views
2

4桁の文字列を読み込み、実際に4桁であることを確認し、桁がないことを確認する簡単なプログラムを作成しようとしていますその後、最初の2桁を最後の2桁から分離して一緒に追加します。私はすべての作業を行うことができますが、私はまだ、このエラーを得た:私はこのような「456f」として文字列をしようとすると、ValueError:int()のリテラルが無効で、数字の桁が10でない場合

ValueError: invalid literal for int() with base 10:

にのみ発生します。

これを修正するために何が変更できますか?

コード:あなたはすべての文字が数字であるかどうかをチェックされますが、このチェックは何も影響を与えません

s = input('please type a 4-digit integer \n') 
valid = True 
for c in s: 
    if len(s)!= 4: 
     valid = False 
    if not c.isdigit(): 
     print (c, 'is not a valid input') 
number = int(s) 
firstOne = number // 100 
secondOne = number % 100 
sum = firstOne + secondOne 
x = '/' 
if valid == True: 
    print('your integer is ' + str(number), x, 'first two digits are ' + str(firstOne), x, 'second two digits are ' + str(secondOne), x, 'sum of two new numbers is ' + str(sum)) 
else: 
    print(len(s), 'is an invalid amount of digits') 

答えて

3

のは、このコードに焦点を当ててみましょう:

for c in s: 
    if len(s)!= 4: 
     valid = False 
    if not c.isdigit(): 
     print (c, 'is not a valid input') 
number = int(s) 

言うべき最初の事はlen()チェックが文字ループの外に移動しなければならないということです。

if len(s)!= 4: 
    valid = False 
for c in s: 
    ... 

次のコメントは、非数字を検出している間は何も問題がないかのようにコードを実行し続けることです。あなたはおそらくvalidFalseに設定するつもりです。

if not c.isdigit(): 
    print (c, 'is not a valid input') 
    valid = False 

ここでは、問題の主要部分です。無効な入力が検出された場合は、変換をスキップしてintにする必要があります。

if valid: 
    number = int(s) 
    ... 

あなたはあなたのコードは次のようになり、このようなアプローチを継続したい場合:

valid = True 
s = input('please type a 4-digit integer \n') 
if len(s)!= 4: 
    valid = False 
    print(len(s), 'is an invalid amount of digits') 

if valid: 
    for c in s: 
     if not c.isdigit(): 
      valid = False 
      print (c, 'is not a valid input') 

if valid: 
    number = int(s) 
    firstOne = number // 100 
    secondOne = number % 100 
    sum = firstOne + secondOne 
    x = '/' 
    print('your integer is ' + str(number), x, 'first two digits are ' + str(firstOne), x, 'second two digits are ' + str(secondOne), x, 'sum of two new numbers is ' + str(sum)) 

ことのすべてを言って、私はおそらくに対処するためのコードにかなりの再編成をしたいですエラーが検出されるとすぐにエラーを報告します。エラー処理をそのように構成することができれば、コードははるかに理解しやすくなります。

s = input('please type a 4-digit integer \n') 
if len(s)!= 4: 
    sys.exit(str(len(s)) + ' is an invalid amount of digits') 
for c in s: 
    if not c.isdigit(): 
     sys.exit(c + ' is not a valid input') 
number = int(s) 
firstOne = number // 100 
secondOne = number % 100 
sum = firstOne + secondOne 
x = '/' 
print('your integer is ' + str(number), x, 'first two digits are ' + str(firstOne), x, 'second two digits are ' + str(secondOne), x, 'sum of two new numbers is ' + str(sum)) 

これで正しい方向に進むことができましたが、コードをより良く、より良くするためにこれを続けることができます。 Sven's answerは、このようなプロセスが最終的にどこにつながるかを示す優れた図です。

+0

これは非常に役に立ちました!どうもありがとうございました。あなたのソリューションは間違いなく最も単純なようですが、有効なコードと論理的なロジックをコード内に維持してエラーメッセージを回避する方法はありますか? – dustdustdust

+1

@dustdustdust:あなたがこの回答が最も役に立つものだと思うなら(私はそれがだと思いますが)、それを受け入れることを検討してください。 –

+0

@dustdustdust確かに。私は本当にそれを綴るために答えを更新しました。しかし、私はこれが悪い解決策であると十分にストレスを感じることはできません。この質問がすべて存在するという事実は、 'if'に基づくエラー処理の問題を示しています。 –

4

- あなたはちょうどあなたが無効な文字を見つけた場合でも続けていきます。これにより、引用符で囲まれたエラーメッセージでコードが失敗します。

それが有効な入力得たまで、私は、クエリを繰り返し整数を読み取るために、専用の機能を使用することをお勧めしたい:私は先頭または末尾のホワイトスペースとそのstr.isdigit()チェックを削除するためにstr.strip()を使用

def input_int_digits(prompt, digits=4): 
    while True: 
     s = input(prompt).strip() 
     if len(s) == digits and s.isdigit(): 
      return int(s) 
     print("Invalid input -- {}-digit integer expected.".format(digits)) 

注意を文字列のすべての文字が数字であるかどうかにかかわらず、文字列をループする必要はありません。それはisdigitをチェックするために、文字列が数字以外が含まれていますが、それでも(int型のために呼び出した場合、あなたはすべての上の)エラーメッセージを印刷して

0

あなたがプログラムを終了する必要が
S「の有効な入力ではありません」後メッセージ

あなたは

sys.exit("is not a valid input") 
2

... 
valid = len(s) == 4 and all(c.isdigit() for c in s) 
if not valid: 
    print (c, 'is not a valid input') 
... 

またはより良い

程度にプリントを変更することができます(おかげで、スヴェン!)

... 
valid = len(s) == 4 and s.isdigit() 
... 
+1

'all(c.isdigit()in c)'の便利なショートカットは 's.isdigit()'です。 –

関連する問題