不同方法的罗马数字转换

时间:2017-04-06 04:27:57

标签: ruby reverse roman-numerals ruby-hash

我使用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不起作用。

2 个答案:

答案 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