Рубиновая лингвистика - PullRequest
       19

Рубиновая лингвистика

0 голосов
/ 18 декабря 2009

Я пытаюсь преобразовать число в слова, но у меня проблема:

>> (91.80).en.numwords
=> "ninety-one point eight"

Я хочу, чтобы это было "девяносто одна точка восемьдесят". Я использую драгоценный камень Лингвистики. Знаете ли вы какое-нибудь решение для этого (предпочитаю с лингвистикой).

Ответы [ 3 ]

4 голосов
/ 18 декабря 2009

Это немного хакерски, но работает:

'91.80'.split('.').map {|i| i.en.numwords}.join(' point ')
=> "ninety-one point eighty"

Когда вы помещаете 91.80 как число с плавающей запятой, ruby ​​избавляется от конечного нуля, поэтому для сохранения этой информации он должен быть строкой. Лучший пример мог бы быть:

'91.83'.split('.').map {|i| i.en.numwords}.join(' point ')
 => "ninety-one point eighty-three"
1 голос
/ 24 февраля 2011

Если вы используете гем Linguistics с Ruby 1.9, вам нужно будет пропатчить строку 1060 из en.rb

# Ruby 1.8 -->  fn = NumberToWordsFunctions[ digits.nitems ]
# Ruby 1.9 removed Array.nitems so we get -->  fn = NumberToWordsFunctions[ digits.count{|x| !x.nil?} ]
fn = NumberToWordsFunctions[ digits.count{|x| !x.nil?} ]

Мы представили небольшой патч автору.

0 голосов
/ 18 декабря 2009

Я получил ответ сам.

def amount_to_words(number)
  unless (number % 1).zero?
    number = number.abs if number < 0
    div = number.div(1)                      
    mod = (number.modulo(1) * 100).round    
    [div.to_s.en.numwords, "point", mod.to_s.en.numwords].join(" ")
  else
    number.en.numwords
  end
end

И результат:

>> amount_to_words(-91.83)
=> "ninety-one point eighty-three"
>> amount_to_words(-91.8)
=> "ninety-one point eighty"
>> amount_to_words(91.8)
=> "ninety-one point eighty"
>> amount_to_words(91.83)
=> "ninety-one point eighty-three"

Хотя, спасибо, ребята. Ваша идея с to_s была полезна для меня.

...