检查输入是否 == Integer/float?使用 irb
Checking if input == Integer/float? using irb
如何检查用户是否没有在循环中的 if 语句中输入整数。我想让 if 语句检查用户是否没有输入整数,系统会说 "please put an integer" 现在,一切正常,但是当用户输入十进制数时,程序会将其转换为整数。我希望程序在用户输入十进制数时说 "you need to put an integer" 。
我试过如果soap.match(/^[\d]+$/).nil?和其他方法,但没有奏效。我想我需要更改 'if (soap_type = SOAPS[soap.to_i])' 中的一些代码,但我不知道如何更改它。
SOAPS = {
1 => 'face soap',
2 => 'bar soap',
3 => 'shave soap',
4 => 'shampoo soap'
}.freeze
loop do
puts "What type of soaps do you want? (#{SOAPS.map { |k, v| "#{k} - #{v}" }.join(', ')}) Please put a number from 1 - 4 "
soap = gets
if (soap_type = SOAPS[soap.to_i])
puts "Great! You want #{soap_type}."
break
elsif !soap.match (/\A[-+]?[0-9]*\.?[0-9]+\Z/)
puts "You didn't enter an integer, please put an integer from 1-4"
else
puts "#{soap.inspect} is not a valid integer, please try again."
end
end
我希望当用户输入一个十进制数时,程序会说你没有输入一个整数,请输入一个整数。
还有更多 Ruby 的表达方式,如果您愿意,可以使用惯用形式:
loop do
puts "What type of soaps do you want? (1 = face soap, 2 = bar soap, 3 = shave soap, 4 = shampoo soap) Please put a number from 1 - 4 "
case (soap = gets)
when '1'
puts "Great! You want face soap."
when '2'
puts "Great! You want bar soap"
when '3'
puts "Great! You want shave soap."
when '4'
puts "Great! You want shampoo soap."
else
puts "#{soap.inspect} is not a valid entry, please try again."
end
end
case
语句可以为您完成大量工作。这里正在测试字符串值而不是费心进行转换,因为这并不重要。
注意仍然有很多重复。这是 查找 table 可以成为简化事情的关键:
SOAPS = {
1 => 'face soap',
2 => 'bar soap',
3 => 'shave soap',
4 => 'shampoo soap'
}.freeze
loop do
puts "What type of soaps do you want? (#{SOAPS.map { |k, v| "#{k} - #{v}" }.join(', ')}) Please put a number from 1 - 4 "
soap = gets
if (soap_type = SOAPS[soap.to_i])
puts "Great! You want #{soap_type}."
else
puts "#{soap.inspect} is not a valid entry, please try again."
end
end
现在您可以轻松地添加和删除整体,所有内容都会相应更新。这是一种数据驱动的方法,也是 Ruby 所擅长的,因为一旦您有了用数据表达的内容,您就可以在此基础上进行一系列转换以获得所需的结果。
如何检查用户是否没有在循环中的 if 语句中输入整数。我想让 if 语句检查用户是否没有输入整数,系统会说 "please put an integer" 现在,一切正常,但是当用户输入十进制数时,程序会将其转换为整数。我希望程序在用户输入十进制数时说 "you need to put an integer" 。
我试过如果soap.match(/^[\d]+$/).nil?和其他方法,但没有奏效。我想我需要更改 'if (soap_type = SOAPS[soap.to_i])' 中的一些代码,但我不知道如何更改它。
SOAPS = {
1 => 'face soap',
2 => 'bar soap',
3 => 'shave soap',
4 => 'shampoo soap'
}.freeze
loop do
puts "What type of soaps do you want? (#{SOAPS.map { |k, v| "#{k} - #{v}" }.join(', ')}) Please put a number from 1 - 4 "
soap = gets
if (soap_type = SOAPS[soap.to_i])
puts "Great! You want #{soap_type}."
break
elsif !soap.match (/\A[-+]?[0-9]*\.?[0-9]+\Z/)
puts "You didn't enter an integer, please put an integer from 1-4"
else
puts "#{soap.inspect} is not a valid integer, please try again."
end
end
我希望当用户输入一个十进制数时,程序会说你没有输入一个整数,请输入一个整数。
还有更多 Ruby 的表达方式,如果您愿意,可以使用惯用形式:
loop do
puts "What type of soaps do you want? (1 = face soap, 2 = bar soap, 3 = shave soap, 4 = shampoo soap) Please put a number from 1 - 4 "
case (soap = gets)
when '1'
puts "Great! You want face soap."
when '2'
puts "Great! You want bar soap"
when '3'
puts "Great! You want shave soap."
when '4'
puts "Great! You want shampoo soap."
else
puts "#{soap.inspect} is not a valid entry, please try again."
end
end
case
语句可以为您完成大量工作。这里正在测试字符串值而不是费心进行转换,因为这并不重要。
注意仍然有很多重复。这是 查找 table 可以成为简化事情的关键:
SOAPS = {
1 => 'face soap',
2 => 'bar soap',
3 => 'shave soap',
4 => 'shampoo soap'
}.freeze
loop do
puts "What type of soaps do you want? (#{SOAPS.map { |k, v| "#{k} - #{v}" }.join(', ')}) Please put a number from 1 - 4 "
soap = gets
if (soap_type = SOAPS[soap.to_i])
puts "Great! You want #{soap_type}."
else
puts "#{soap.inspect} is not a valid entry, please try again."
end
end
现在您可以轻松地添加和删除整体,所有内容都会相应更新。这是一种数据驱动的方法,也是 Ruby 所擅长的,因为一旦您有了用数据表达的内容,您就可以在此基础上进行一系列转换以获得所需的结果。