2

ユーザーに数字の入力を求める小さなプログラムを作成しようとしています。プログラムはそれが有効な数字かどうかを判断します。ユーザーは、任意の種類の数値 (整数、浮動小数点数、科学表記法など) を入力できます。

私の質問は、「7w」のようなものが有効な数値として一致しないようにするために使用する正規表現は何ですか? また、番号0でループを終了してプログラムを終了したいのですが、現在書かれているように、0は他の番号と同様に有効です。洞察をお願いします。

x = 1

while x != 0
  puts "Enter a string"
  num = gets

  if num.match(/\d+/)
    puts "Valid"
  else
    puts "invalid"
  end

  if num == 0
    puts "End of program"
    x = num
  end   
end
4

2 に答える 2

2

このスクリプトは、テキスト エディタではなくコマンド ラインから実行する必要があります。数値の入力を求めるプロンプトが表示されるからです。

こちらは超コンパクト版

def validate(n)
  if (Float(n) != nil rescue return :invalid)
    return :zero if n.to_f == 0
    return :valid
  end
end
print "Please enter a number: "
puts "#{num = gets.strip} is #{validate(num)}"

出力:

Please enter a number: 00
00 is zero

これは、必要に応じて調整するために拡張できる可能性が高い、より長いバージョンです。

class String
  def numeric?
    Float(self) != nil rescue false
  end
end

def validate(n)
  if n.numeric?
    return :zero if n.to_f == 0
    return :valid
  else
    return :invalid
  end
end

print "Please enter a number: "
puts "#{num = gets.strip} is #{validate(num)}"

そして、これはすべての可能なケースのテストです

test_cases = [
  "33", #int pos
  "+33", #int pos
  "-33", #int neg
  "1.22", #float pos
  "-1.22", #float neg
  "10e5", #scientific notation
  "X", #STRING not numeric
  "", #empty string
  "0", #zero
  "+0", #zero
  "-0", #zero
  "0.00000", #zero
  "+0.00000", #zero
  "-0.00000", #zero
  "-999999999999999999999995444444444444444444444444444444444444434567890.99", #big num
  "-1.2.3", #version number
  "  9  ", #trailing spaces
]

puts "\n** Test cases **"
test_cases.each do |n|
  puts "#{n} is #{validate(n)}"
end

どの出力:

Please enter a number: 12.34
12.34 is valid

** Test cases ** 33 is valid
+33 is valid
-33 is valid
1.22 is valid
-1.22 is valid
10e5 is valid
X is invalid
 is invalid
0 is zero
+0 is zero
-0 is zero
0.00000 is zero
+0.00000 is zero
-0.00000 is zero
-999999999999999999999995444444444444444444444444444444444444434567890.99 is valid
-1.2.3 is invalid
   9   is valid

数値かどうかを確認するというアイデアのソース:

于 2012-10-15T03:26:04.287 に答える
1

まず、ループを複雑にしすぎています。次に、正規表現をもう少し明示的にする必要があります。次のようなことを試してください:

x = 1

while x != 0
  puts "Enter a string"
  num = gets.chomp
  if num == "0"
    puts "exiting with 0"
    exit 0
  elsif num.match(/^[0-9](\.[0-9])?$+/)
    puts "Valid"
  else
    puts "invalid"
  end
end

この式は、数字または小数を含むすべての数値に一致し、文字を含むものには一致しません。入力された文字列が正確に 0 の場合、スクリプトはステータス 0 で終了します。

于 2012-10-14T14:34:49.207 に答える