我使用case
语句将罗马数字转换为数字,反之亦然。我的情况通过检查输入字符串或整数来获取true或false。如果我输入5我应该输出V并且如果我输入M我应该输出1000。
我可以让我的“假”案件正常工作。但我无法让我的“真实”案件发挥作用。
我将Roman_Numerals
转换为名为Arabic_Numerals
的反向哈希。我不明白为什么我的true
案例不起作用,因为它恰恰相反。
Roman_Numerals = {
"M" => 1000,
"D" => 500,
"C" => 100,
"L" => 50,
"X" => 10,
"V" => 5,
"I" => 1,
}
#Reverses the Roman Numerals and Arabic Numbers around in the Hash
#to look like 1000 => "M".
Arabic_Numberals = Hash[Roman_Numerals.to_a.reverse.reverse]
input = gets.chomp.upcase
def numeric?
Float(self) != nil rescue false
end
true_false = input.numeric?
#Looks for true or false from true_false variable. Then goes through
#the case to convert a roman numeral or a number.
case true_false
when false
#Converts a Roman Numeral to a Number
Roman_Numerals.each do |roman, value|
puts "#{roman}:#{value}"
if roman == input
puts "Answer: The Roman Numeral '#{input}' => #{value}."
break
else
next
end
end
#Converts a Number to a Roman Numeral
when true
Arabic_Numberals.each do |arabic, letter|
puts "#{letter}:#{arabic}"
puts "#{input}"
if input == arabic
puts "Answer: The Number '#{input}' => #{letter}"
break
else
puts "Why isn't this code working?"
next
end
end
end
请告知我false
案例不起作用的原因。我不确定为什么arabic == input
不起作用。
答案 0 :(得分:1)
有2个错误,第一个错误:
public function state_names() {
$this->db->select('name')
$this->db->get('place')
$this->db->where('parent','India');
$query=$this->db->get();
return $query->result_array();
}
此代码确实没有。你想在这里做的是交换键/值,所以你可以使用Arabic_Numberals = Hash[Roman_Numerals.to_a.reverse.reverse]
:
Hash#invert
另一个是比较输入时:
Arabic_Numberals = Roman_Numerals.invert
它会比较if input == arabic
,这是假的。在比较之前,您需要将输入转换为整数:
'5' == 5
我希望它有所帮助!
答案 1 :(得分:1)
我从您的代码中删除了很多评论和额外条件。请查看以下版本的代码是否符合您的要求:
ROMAN_NUMBER_MAP = {
"M" => 1000,
"D" => 500,
"C" => 100,
"L" => 50,
"X" => 10,
"V" => 5,
"I" => 1,
}
input = gets.chomp.upcase
def numeric?
!!Float(self) rescue false
end
if input.numeric?
puts "Answer: The Number '#{input}' => #{ROMAN_NUMBER_MAP.key(input.to_i)}"
else
puts "Answer: The Roman Numeral '#{input}' => #{ROMAN_NUMBER_MAP[input]}."
end