web-dev-qa-db-fra.com

Utiliser Ruby pour convertir des nombres en mots?

Comment convertir des nombres en mots en rubis?

Je sais qu'il y a un petit bijou quelque part. Essayer de le mettre en œuvre sans un bijou. J'ai juste besoin des nombres en mots en anglais pour les nombres entiers. J'ai trouvé ça mais c'est très compliqué. Si vous avez une idée sur la façon de mettre en œuvre une solution de nettoyage plus facile à lire, partagez-la.

http://raveendran.wordpress.com/2009/05/29/Ruby-convert-number-to-english-Word/

Voici ce sur quoi j'ai travaillé. Mais avoir un problème pour mettre en œuvre les échelles. Le code est toujours un désordre. J'espère le rendre plus lisible lorsqu'il fonctionnera correctement.

   class Numberswords
    def in_words(n)

    words_hash = {0=>"zero",1=>"one",2=>"two",3=>"three",4=>"four",5=>"five",6=>"six",7=>"seven",8=>"eight",9=>"nine",
                    10=>"ten",11=>"eleven",12=>"twelve",13=>"thirteen",14=>"fourteen",15=>"fifteen",16=>"sixteen",
                     17=>"seventeen", 18=>"eighteen",19=>"nineteen",
                    20=>"twenty",30=>"thirty",40=>"forty",50=>"fifty",60=>"sixty",70=>"seventy",80=>"eighty",90=>"ninety"}

     scale = [000=>"",1000=>"thousand",1000000=>" million",1000000000=>" billion",1000000000000=>" trillion", 1000000000000000=>" quadrillion"]


    if words_hash.has_key?(n) 
      words_hash[n]

      #still working on this middle part. Anything above 999 will not work
     elsif n>= 1000  
     print  n.to_s.scan(/.{1,3}/) do |number|
            print number
      end



      #print value = n.to_s.reverse.scan(/.{1,3}/).inject([]) { |first_part,second_part| first_part << (second_part == "000" ? "" : second_part.reverse.to_i.in_words) }
      #(value.each_with_index.map { |first_part,second_part| first_part == "" ? "" : first_part + scale[second_part] }-[""]).reverse.join(" ")

    elsif n <= 99
       return [words_hash[n - n%10],words_hash[n%10]].join(" ")
    else
      words_hash.merge!({ 100=>"hundred" })
      ([(n%100 < 20 ? n%100 : n.to_s[2].to_i), n.to_s[1].to_i*10, 100, n.to_s[0].to_i]-[0]-[10])
        .reverse.map { |num| words_hash[num] }.join(" ")
    end
  end
end

#test code
test = Numberswords.new
 print test.in_words(200)
12
hken27

Ma prise sur ce

def in_words(int)
  numbers_to_name = {
      1000000 => "million",
      1000 => "thousand",
      100 => "hundred",
      90 => "ninety",
      80 => "eighty",
      70 => "seventy",
      60 => "sixty",
      50 => "fifty",
      40 => "forty",
      30 => "thirty",
      20 => "twenty",
      19=>"nineteen",
      18=>"eighteen",
      17=>"seventeen", 
      16=>"sixteen",
      15=>"fifteen",
      14=>"fourteen",
      13=>"thirteen",              
      12=>"twelve",
      11 => "eleven",
      10 => "ten",
      9 => "nine",
      8 => "eight",
      7 => "seven",
      6 => "six",
      5 => "five",
      4 => "four",
      3 => "three",
      2 => "two",
      1 => "one"
    }
  str = ""
  numbers_to_name.each do |num, name|
    if int == 0
      return str
    elsif int.to_s.length == 1 && int/num > 0
      return str + "#{name}"      
    elsif int < 100 && int/num > 0
      return str + "#{name}" if int%num == 0
      return str + "#{name} " + in_words(int%num)
    elsif int/num > 0
      return str + in_words(int/num) + " #{name} " + in_words(int%num)
    end
  end
end



puts in_words(4) == "four"
puts in_words(27) == "twenty seven"
puts in_words(102) == "one hundred two"
puts in_words(38_079) == "thirty eight thousand seventy nine"
puts in_words(82102713) == "eighty two million one hundred two thousand seven hundred thirteen"
16
NoNonsense

Avez-vous envisagé d'humaniser?

https://github.com/radar/humanize

11
rhernando

Vous pouvez également utiliser le to_words gem.

Cette gemme convertit les entiers en mots.

par exemple.

1.to_words # one ,

100.to_words # one hundred ,

101.to_words # one hundred and one

Il convertit également les nombres négatifs.

6
taimur akhtar

Réponse simple, utilisez humanize gem et vous obtiendrez le résultat souhaité

require 'humanize'

1.humanize       #=> 'one'
345.humanize     #=> 'three hundred and forty-five'
1723323.humanize #=> 'one million, seven hundred and twenty-three thousand, three hundred and twenty-three'

Si vous l'utilisez dans Rails, vous pouvez directement l'utiliser

2
Deepak Mahakale

Je peux voir ce que vous cherchez, et vous voudrez peut-être consulter ce post de StackOverflow: Rails de conversion de nombre en anglais Word

La voici en résumé:

Non, vous devez écrire une fonction vous-même. La chose la plus proche de ce que vous voulez Est number_to_human, mais cela ne convertit pas 1 en un.

Voici quelques URL qui peuvent être utiles:

http://codesnippets.joyent.com/posts/show/447http://raveendran.wordpress.com/2009/05/29/Ruby-convert-number-to- english-Word/http://deveiate.org/projects/Linguistics/

1
Richard Peck

Je ne suis pas tout à fait sûr, si cela fonctionne pour vous. La méthode peut s'appeler comme ça.

n2w(33123) {|i| puts i unless i.to_s.empty?}

Voici la méthode (je ne l’ai pas testée à fond. Je pense que ça marche jusqu’à un million de dollars. Le code est moche, il ya beaucoup de place pour la refactorisation.)

def n2w(n)
  words_hash = {0=>"zero",1=>"one",2=>"two",3=>"three",4=>"four",5=>"five",6=>"six",7=>"seven",8=>"eight",9=>"nine",
                    10=>"ten",11=>"eleven",12=>"twelve",13=>"thirteen",14=>"fourteen",15=>"fifteen",16=>"sixteen",
                     17=>"seventeen", 18=>"eighteen",19=>"nineteen",
                    20=>"twenty",30=>"thirty",40=>"forty",50=>"fifty",60=>"sixty",70=>"seventy",80=>"eighty",90=>"ninety"}
  scale = {3=>"hundred",4 =>"thousand",6=>"million",9=>"billion"}

  if words_hash.has_key?n
    yield words_hash[n] 
  else
    ns = n.to_s.split(//)
      while ns.size > 0      
        if ns.size == 2
            yield("and")
            yield words_hash[(ns.join.to_i) - (ns.join.to_i)%10]            
            ns.shift
        end
        if ns.size > 4
          yield(words_hash[(ns[0,2].join.to_i) - (ns[0,2].join.to_i) % 10])
        else
          yield(words_hash[ns[0].to_i]) 
        end
        yield(scale[ns.size])
        ns.shift
      end
    end
end
0
Bala
def subhundred number

  ones = %w{zero one two three four five six seven eight nine
            ten eleven twelve thirteen fourteen fifteen
            sixteen seventeen eighteen nineteen}

  tens = %w{zero ten twenty thirty **forty** fifty sixty seventy eighty ninety}

  subhundred = number % 100

  return [ones[subhundred]] if subhundred < 20

  return [tens[subhundred / 10]] if subhundred % 10 == 0

  return [tens[subhundred / 10], ones[subhundred % 10]]

end




def subthousand number

  hundreds = (number % 1000) / 100

  tens = number % 100

  s = []

  s = subhundred(hundreds) + ["hundred"] unless hundreds == 0

  s = s + ["and"] unless hundreds == 0 or tens == 0

  s = s + [subhundred(tens)] unless tens == 0


end




def decimals number

  return [] unless number.to_s['.']

  digits = number.to_s.split('.')[1].split('').reverse

  digits = digits.drop_while {|d| d.to_i == 0} . reverse

  digits = digits.map {|d| subhundred d.to_i} . flatten

  digits.empty? ? [] : ["and cents"] + digits

end





def words_from_numbers number

  steps = [""] + %w{thousand million billion trillion quadrillion quintillion sextillion}

  result = []

  n = number.to_i

  steps.each do |step|

    x = n % 1000

    unit = (step == "") ? [] : [step]

    result = subthousand(x) + unit  + result unless x == 0

    n = n / 1000

  end



  result = ["zero"] if result.empty?

  result = result + decimals(number)




  result.join(' ').strip

end






 def words_from_numbers(number)

    ApplicationHelper.words_from_numbers(number)

  end
0
dsn raghavendra rao