如何在Ruby中将印度语 - 阿拉伯数字转换为孟加拉语数字?

时间:2017-03-23 11:09:49

标签: ruby locale

我制作了一个方法serial_bn,它采用印度语 - 阿拉伯数字并返回相应的孟加拉语数字:

def serial_bn(var)
    if var == "1"
      return "১"
    end
    if var == "2"
      return "২"
    end
    if var == "3"
       return "৩"
    end
    if var == "4"
       return "৪"
    end
    if var == "5"
       return "৫"
    end
    if var == "6"
       return "৬"
    end
    if var == "7"
       return "৭"
    end
    if var == "8"
       return "৮"
    end
    if var == "9"
       return "৯"
    end
    if var == "0"  
       return "০"
    end
  end

我想将数字的每个数字作为字符串传递给上面的方法。例如,对于"1234",我希望输出类似于"১২৩৪",而中间没有空格。

我试过了:

"1234".to_s.split('').each do |i|
 serial_bn(i.chr)

返回输出,其间有空格:

"১ ২ ৩ ৪"

任何帮助?

5 个答案:

答案 0 :(得分:8)

"1234".tr("1234567890", "১২৩৪৫৬৭৮৯০")
# => "১২৩৪"

或者,我不确定目标语言,但可能这也应该有效:

"1234".tr("0-9", "০-৯")
# => "১২৩৪"

答案 1 :(得分:2)

让我建议你更多"传统"处理问题。

由于映射是稳定的,因此创建一个常量:

SERIAL_BN_MAP = {
  1 => '১',
  2 => '২',
  3 => '৩',
  4 => '৪',
  5 => '৫',
  6 => '৬',
  7 => '৭',
  8 => '৮',
  9 => '৯',
  0 => '০'
}.freeze

现在方法(使用Integer#digits):

def convert(number)
  number.digits.reverse.map { |d| SERIAL_BN_MAP[d] }.join
end

用法:

convert(1234)
#=> "১২৩৪"

答案 2 :(得分:0)

您可以使用gsub

2.2.5 :011 > text = "১ ২ ৩ ৪"
2.2.5 :010 > text.gsub(' ','')
 => "১২৩৪"

另外,我建议您使用案例陈述 -

def serial_bn(var)
  case var
  when "1" then "১" 
  when "2" then "২"
  # etc
  else
    # handle other input
  end
end

答案 3 :(得分:0)

字符串有tr方法,可替换字符:

p "123409".tr( "1234567890", "১২৩৪৫৬৭৮৯০") # => "১২৩৪০৯"

答案 4 :(得分:0)

我会将Andrey和sawas的答案结合起来,因为它们在某种语言特定的转换类中都有很好的实现:

SERIAL_CONVERSION = "১২৩৪৫৬৭৮৯০"
EN_SERIAL_DIGITS = "1234567890"

( ... )

def convert_serial(serial)
  serial.tr(EN_SERIAL_DIGITS, SERIAL_CONVERSION)
end

你可以用一种更好的方式将EN数字映射到另一种语言,甚至可能让类继承自EnglishDigit类或其他东西,这样你就不需要复制EN_SERIAL_DIGITS了。真的,但我总是在这里使用某种常数。