Using Ruby convert numbers to words?

前端 未结 8 1373
广开言路
广开言路 2020-12-09 19:30

How to convert numbers to words in ruby?

I know there is a gem somewhere. Trying to implement it without a gem. I just need the numbers to words in English for integ

8条回答
  •  执念已碎
    2020-12-09 20:04

    Here is how I chose to solve the problem, using several smaller methods to handle the solution. Hope this helps!

    module WordsModule
    
      def in_words
    
        if self == 0
          return "zero"
        elsif self > 999_999_999_999
          return trillions(self)
        elsif self > 999_999_999
          return billions(self)
        elsif self > 999_999
          return millions(self)
        elsif self > 999
          return thousands(self)
        elsif self > 99
          return hundreds(self)
        elsif self > 9
          return "#{tens(self)}"
        else
          return "#{single(self)}"
        end
    
      end
    
    private
    
      def trillions(number)
        if number.between?(100_000_000_000_000, 999_999_999_999_999)
          if number % 1_000_000_000_000 == 0
            "#{hundreds(number/1_000_000_000_000)} trillion"
          else
            "#{hundreds(number/1_000_000_000_000)} trillion #{billions(number%1_000_000_000_000)}"
          end
        elsif number.between?(10_000_000_000_000, 99_999_999_999_999)
          if number % 1_000_000_000_000 == 0
            "#{tens(number/1_000_000_000_000)} trillion"
          else
            "#{tens(number/1_000_000_000_000)} trillion #{billions(number%1_000_000_000_000)}"
          end
        elsif number.between?(1_000_000_000_000, 9_999_999_999_999)
          if number % 1_000_000_000_000 == 0
            "#{single(number/1_000_000_000_000)} trillion"
          else
            "#{single(number/1_000_000_000_000)} trillion #{billions(number%1_000_000_000_000)}"
          end
        else
          millions(number)
        end
      end
    
    
      def billions(number)
        if number.between?(100_000_000_000, 999_999_999_999)
          if number % 1_000_000_000 == 0
            "#{hundreds(number/1_000_000_000)} billion"
          else
            "#{hundreds(number/1_000_000_000)} billion #{millions(number%1_000_000_000)}"
          end
        elsif number.between?(10_000_000_000, 99_999_999_999)
          if number % 1_000_000_000 == 0
            "#{tens(number/1_000_000_000)} billion"
          else
            "#{tens(number/1_000_000_000)} billion #{millions(number%1_000_000_000)}"
          end
        elsif number.between?(1_000_000_000, 9_999_999_999)
          if number % 1_000_000_000 == 0
            "#{single(number/1_000_000_000)} billion"
          else
            "#{single(number/1_000_000_000)} billion #{millions(number%1_000_000_000)}"
          end
        else
          millions(number)
        end
      end
    
    
      def millions(number)
        if number.between?(100_000_000, 999_999_999)
          if number % 1_000_000 == 0
            "#{hundreds(number/1_000_000)} million"
          else
            "#{hundreds(number/1_000_000)} million #{thousands(number%1_000_000)}"
          end
        elsif number.between?(10_000_000, 99_999_999)
          if number % 1_000_000 == 0
            "#{tens(number/1_000_000)} million"
          else
            "#{tens(number/1_000_000)} million #{thousands(number%1_000_000)}"
          end
        elsif number.between?(1_000_000, 9_999_999)
          if number % 1_000_000 == 0
            "#{single(number/1_000_000)} million"
          else
            "#{single(number/1_000_000)} million #{thousands(number%1_000_000)}"
          end
        else
          thousands(number)
        end
      end
    
    
      def thousands(number)
        if number.between?(100_000, 999_999)
          if number % 1000 == 0
            "#{hundreds(number/1000)} thousand"
          else
            "#{hundreds(number/1000)} thousand #{hundreds(number%1000)}"
          end
        elsif number.between?(10_000, 99_999)
          if number % 1000 == 0
            "#{tens(number/1000)} thousand"
          else
            "#{tens(number/1000)} thousand #{hundreds(number%1000)}"
          end
        elsif number.between?(1_000, 9_999)
          if number % 1000 == 0
            "#{single(number/1000)} thousand"
          else
            "#{single(number/1000)} thousand #{hundreds(number%1000)}"
          end
        else
          hundreds(number)
        end
      end
    
    
      def hundreds(number)
        if number % 100 == 0
          "#{single(number/100)} hundred"
        elsif number.between?(101, 999)
          "#{single(number/100)} hundred #{tens(number%100)}"
        else
          tens(number)
        end
      end
    
    
      def tens(number)
        teens = {
          11 => "eleven",
          12 => "twelve",
          13 => "thirteen",
          14 => "fourteen",
          15 => "fifteen",
          16 => "sixteen",
          17 => "seventeen",
          18 => "eighteen",
          19 => "nineteen"
        }
    
        tens = {
          1 => "ten",
          2 => "twenty",
          3 => "thirty",
          4 => "forty",
          5 => "fifty",
          6 => "sixty",
          7 => "seventy",
          8 => "eighty",
          9 => "ninety"
        }
    
        if number.between?(11, 19)
          teens[number]
        elsif number % 10 == 0
          tens[number/10]
        elsif number.between?(21, 99)
          "#{tens[number/10]} #{single(number%10)}"
        else
          single(number)
        end
      end
    
    
      def single(number)
        single_digit_hash = {
          1 => "one",
          2 => "two",
          3 => "three",
          4 => "four",
          5 => "five",
          6 => "six",
          7 => "seven",
          8 => "eight",
          9 => "nine"
        }
    
        single_digit_hash[number]
      end
    
    end
    
    
    class Integer
      include WordsModule
    end
    

提交回复
热议问题