Advertisement
Guest User

Untitled

a guest
Feb 21st, 2018
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.03 KB | None | 0 0
  1. ## number_magick.rb [ruby]
  2. #!/usr/bin/env ruby
  3. # Author:: Jan Wikholm [jw@jw.fi]
  4. # License:: MIT
  5. require 'logger'
  6. module JW
  7. # not in any way associated with ImageMagick
  8. class NumberMagick
  9. @@logger = Logger.new('numbers.log')
  10. NUMBERS = {
  11. 'one' => 1, 'two' => 2, 'three' => 3,
  12. 'four' => 4, 'five' => 5, 'six' => 6,
  13. 'seven' => 7, 'eight' => 8, 'nine' => 9,
  14. 'ten' => 10, 'eleven' => 11, 'twelve' => 12,
  15. 'thirteen' => 13, 'fifteen' => 15, 'eighteen' => 18,
  16. 'twenty' => 20, 'thirty' => 30, 'forty' => 40, 'fifty' => 50,
  17. 'eighty' => 80
  18. }
  19. MULTIPLIERS = {
  20. 'hundred' => 100, 'thousand' => 1000,
  21. 'million' => 1_000_000, 'billion' => 1_000_000_000
  22. }
  23. class << self
  24. def convert(number_as_string)
  25. @@logger.info "*** Original string: #{number_as_string}"
  26. parts = number_as_string.gsub(/-/, ' ').gsub(/\ban?d?\b/, '').split
  27. @@logger.info "Number cleaned was: #{parts.join(' ')}"
  28. total = 0
  29. part_total = 0
  30. parts.each do |part|
  31. @@logger.info "---\nStarting with\t\t#{part}"
  32. if MULTIPLIERS.include? part
  33. if part_total != 0
  34. total += part_total * MULTIPLIERS[part]
  35. part_total = 0
  36. else
  37. total += MULTIPLIERS[part]
  38. end
  39. elsif NUMBERS.include? part
  40. part_total += NUMBERS[part]
  41. elsif part =~ /^[0-9]+$/
  42. part_total += part.to_i
  43. else
  44. case part
  45. when /teen$/
  46. number_part = part.gsub(/teen$/, '')
  47. raise "Unknown number #{part}" unless NUMBERS.include? number_part
  48. part_total += NUMBERS[number_part] + 10 # for the -teen
  49. when /ty$/
  50. number_part = part.gsub(/ty$/, '')
  51. raise "Unknown number #{part}" unless NUMBERS.include? number_part
  52. part_total += NUMBERS[number_part] * 10 # for the -ty (like sixty = 6*10)
  53. end
  54. end
  55. @@logger.info "---\nEnding with\t\t#{part}"
  56. end
  57. total += part_total
  58. end
  59. end
  60. end
  61. end
  62.  
  63. ## number_magic_test.rb [ruby]
  64. #!/usr/bin/env ruby
  65. # Author:: Jan Wikholm [jw@jw.fi]
  66. # License:: MIT
  67.  
  68. require 'test/unit'
  69. require 'number_magick.rb'
  70.  
  71. class ParseNumbersTest < Test::Unit::TestCase
  72.  
  73. def test_parse
  74. strings = {1 => 'one',
  75. 5 => 'five',
  76. 10 => 'ten',
  77. 11 => 'eleven',
  78. 12 => 'twelve',
  79. 13 => 'thirteen',
  80. 14 => 'fourteen',
  81. 15 => 'fifteen',
  82. 16 => 'sixteen',
  83. 17 => 'seventeen',
  84. 18 => 'eighteen',
  85. 19 => 'nineteen',
  86. 20 => 'twenty',
  87. 27 => 'twenty seven',
  88. 31 => 'thirty-one',
  89. 59 => 'fifty nine',
  90. 100 => 'a hundred',
  91. 100 => 'one hundred',
  92. 150 => 'one hundred and fifty',
  93. #150 => 'one fifty',
  94. 200 => 'two-hundred',
  95. 500 => '5 hundred',
  96. 999 => 'nine hundred and ninety nine',
  97. 1_000 => 'one thousand',
  98. 1_200 => 'twelve hundred',
  99. 1_200 => 'one thousand two hundred',
  100. 17_000 => 'seventeen thousand',
  101. 21_473 => 'twenty-one-thousand-four-hundred-and-seventy-three',
  102. 74_002 => 'seventy four thousand and two',
  103. 99_999 => 'ninety nine thousand nine hundred ninety nine',
  104. 100_000 => '100 thousand',
  105. 250_000 => 'two hundred and fifty thousand',
  106. 1_000_000 => 'one million',
  107. #1_250_007 => 'one million two hundred fifty thousand and seven',
  108. 1_000_000_000 => 'one billion',
  109. 1_000_000_001 => 'one billion and one'}
  110.  
  111. strings.keys.sort.each do |key|
  112. assert_equal key, JW::NumberMagick.convert(strings[key])
  113. end
  114. end
  115.  
  116. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement