num_words 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dcb338b276c0afbc161d4ede15bb75c6f64fd279be42066ecabb9c2c986be10c
4
- data.tar.gz: 60b8112d1ad8729eb652d7acd893b1cd1e5aa83b5ac31a200ff8df06ca83a4a8
3
+ metadata.gz: a0d117daa9a0ef678984f1a03b1b1456047e7ea67b4b13f610ab8cfb90634646
4
+ data.tar.gz: 4732ef7b105d1ae22b208529fe6098cbab124aef3547ee4650f3d24dd4b3a89e
5
5
  SHA512:
6
- metadata.gz: e12980e8da746190aa011b645978741ac7c7dbc2ce5c9dc91c8fa6ebae3ca4dd57d25b81295d3d28294fc417e7ca0dc3536e45cead806363fcc62122c633442b
7
- data.tar.gz: 42dc76855150a5c44fa7cce78d6fa401ec4e161ee6808642dfded60919d65b5ec01bee2b939b288f37ac5dd16948c556b5f79a8f7d5f9cd8af2536c58f580e5f
6
+ metadata.gz: 75c3b9d42dc93e10d5a413d2f1a03b04921f8277dd1ae056bcf4f020c9672e6e4737752d82d02541e9ac9b0560e0facb5888e64cb3de72ee83dcb881855f27b0
7
+ data.tar.gz: 666c1624f2d5c82ac29cd479f3c1625f0f43941be7876d190b3483ff87de195d4c949b9d88b74b9c10e8886f64e2657d91812ce85a2041fd5705d4038900208c
data/README.md CHANGED
@@ -13,8 +13,25 @@
13
13
  - **UK** – `thousand, million, billion`
14
14
  - **France** – `mille, million, milliard`
15
15
  - **India** – `thousand, lakh, crore`
16
+ - Supports multiple languages:
17
+ - **English** (`:en`)
18
+ - **Hindi** (`:hi`)
19
+ - **French** (`:fr`) *(optional / extended)*
16
20
  - Easy to integrate into Ruby or Rails applications.
17
21
  - Supports numbers up to `duovigintillion` (10^69) in the American system.
22
+ - Handles both integers and decimal numbers.
23
+
24
+ # In US system
25
+ - NumWords.to_words(123456789012345, country: :us, language: :en)
26
+ - "one hundred and twenty-three trillion four hundred and fifty-six billion seven hundred and eighty-nine million twelve thousand three hundred and forty-five"
27
+
28
+ # In Hindi
29
+ - NumWords.to_words(123456789012345, country: :hi, language: :hi)
30
+ - "बारह खरब चौतीस अरब छप्पन करोड़ सात करोड़ अस्सी लाख बारह हज़ार तीन सौ पैंतालीस"
31
+
32
+ # Indian number with decimals
33
+ - NumWords.to_words(1234567890.123, country: :in, language: :en)
34
+ - "one hundred and twenty-three crore forty-five lakh sixty-seven thousand eight hundred and ninety and one two three"
18
35
 
19
36
  ---
20
37
 
@@ -26,6 +43,10 @@ After releasing your gem to [RubyGems.org](https://rubygems.org), install it wit
26
43
 
27
44
  ```bash
28
45
  # Using Bundler
29
- bundle add num_words
46
+ bundle add gem "num_words"
47
+
48
+ # Or using gem install
49
+ gem install num_words
50
+
51
+
30
52
 
31
- bundle add num_words
@@ -6,18 +6,26 @@ module NumWords
6
6
  ONES_EN = %w[zero one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen].freeze
7
7
  TENS_EN = %w[zero ten twenty thirty forty fifty sixty seventy eighty ninety].freeze
8
8
 
9
- # --- Hindi words ---
10
- ONES_HI = %w[शून्य एक दो तीन चार पाँच छह सात आठ नौ दस ग्यारह बारह तेरह चौदह पंद्रह सोलह सत्रह अठारह उन्नीस].freeze
11
- TENS_HI = %w[शून्य दस बीस तीस चालीस पचास साठ सत्तर अस्सी नब्बे].freeze
12
- INDIAN_UNITS_HI = ['', 'हज़ार', 'लाख', 'करोड़', 'अरब', 'खरब'].freeze
9
+ # --- Hindi numbers 1 to 99 (pure Hindi) ---
10
+ HINDI_NUMBERS_1_TO_99 = {
11
+ 0=>"शून्य",1=>"एक",2=>"दो",3=>"तीन",4=>"चार",5=>"पाँच",6=>"छह",7=>"सात",8=>"आठ",9=>"नौ",10=>"दस",
12
+ 11=>"ग्यारह",12=>"बारह",13=>"तेरह",14=>"चौदह",15=>"पंद्रह",16=>"सोलह",17=>"सत्रह",18=>"अठारह",19=>"उन्नीस",
13
+ 20=>"बीस",21=>"इक्कीस",22=>"बाईस",23=>"तेईस",24=>"चौबीस",25=>"पच्चीस",26=>"छब्बीस",27=>"सत्ताईस",28=>"अट्ठाईस",29=>"उनतीस",
14
+ 30=>"तीस",31=>"इकतीस",32=>"बत्तीस",33=>"तैंतीस",34=>"चौंतीस",35=>"पैंतीस",36=>"छत्तीस",37=>"सैंतीस",38=>"अड़तीस",39=>"उनतालीस",
15
+ 40=>"चालीस",41=>"इकतालीस",42=>"बयालीस",43=>"तैंतालीस",44=>"चवालीस",45=>"पैंतालीस",46=>"छियालीस",47=>"सैंतालीस",48=>"अड़तालीस",49=>"उनचास",
16
+ 50=>"पचास",51=>"इक्यावन",52=>"बावन",53=>"तिरेपन",54=>"चौवन",55=>"पचपन",56=>"छप्पन",57=>"सत्तावन",58=>"अट्ठावन",59=>"उनसठ",
17
+ 60=>"साठ",61=>"इकसठ",62=>"बासठ",63=>"तिरेसठ",64=>"चौंसठ",65=>"पैंसठ",66=>"छियासठ",67=>"सड़सठ",68=>"अड़सठ",69=>"उनहत्तर",
18
+ 70=>"सत्तर",71=>"इकहत्तर",72=>"बहत्तर",73=>"तिहत्तर",74=>"चौहत्तर",75=>"पचहत्तर",76=>"छिहत्तर",77=>"सतहत्तर",78=>"अठहत्तर",79=>"उन्यासी",
19
+ 80=>"अस्सी",81=>"इक्यासी",82=>"बयासी",83=>"तिरेासी",84=>"चौरासी",85=>"पचासी",86=>"छियासी",87=>"सत्तासी",88=>"अठासी",89=>"नवासी",
20
+ 90=>"नब्बे",91=>"इक्यानवे",92=>"बयानवे",93=>"तिरेनवे",94=>"चौरानवे",95=>"पचानवे",96=>"छियानवे",97=>"सत्तानवे",98=>"अट्ठानवे",99=>"निन्यानवे"
21
+ }.freeze
13
22
 
14
- # --- English exponents ---
23
+ INDIAN_UNITS_HI = ['', 'हज़ार', 'लाख', 'करोड़', 'अरब', 'खरब'].freeze
15
24
  AM_EXPONENTS = {
16
25
  3 => 'thousand', 6 => 'million', 9 => 'billion', 12 => 'trillion',
17
26
  15 => 'quadrillion', 18 => 'quintillion', 21 => 'sexillion', 24 => 'septillion',
18
27
  27 => 'octillion', 30 => 'nonillion', 33 => 'decillion', 36 => 'undecillion'
19
28
  }.freeze
20
-
21
29
  INDIAN_UNITS_EN = ['', 'thousand', 'lakh', 'crore', 'arab', 'kharab'].freeze
22
30
 
23
31
  COUNTRY_EXPONENTS = {
@@ -26,19 +34,18 @@ module NumWords
26
34
  }.freeze
27
35
 
28
36
  class << self
29
- # Main method: convert number to words
30
- # language: :en or :hi
37
+ # Convert number to words
31
38
  def to_words(number, country: :us, language: :en, include_and: true)
32
39
  if [:in].include?(country) && language == :hi
33
- return to_words_indian(number, language: language)
40
+ return to_words_indian(number)
34
41
  end
35
42
 
36
43
  val = number.to_i.abs
37
44
  return 'zero' if val.zero?
38
45
 
39
46
  exp_hash = COUNTRY_EXPONENTS[country] || AM_EXPONENTS
40
- ones_array = language == :hi ? ONES_HI : ONES_EN
41
- tens_array = language == :hi ? TENS_HI : TENS_EN
47
+ ones_array = language == :hi ? HINDI_NUMBERS_1_TO_99 : ONES_EN
48
+ tens_array = language == :hi ? HINDI_NUMBERS_1_TO_99 : TENS_EN
42
49
  units = language == :hi ? INDIAN_UNITS_HI : INDIAN_UNITS_EN
43
50
 
44
51
  if country == :in
@@ -48,22 +55,40 @@ module NumWords
48
55
  end
49
56
  end
50
57
 
51
- # Indian system (supports English & Hindi)
52
- def to_words_indian(num, language: :en)
53
- integer_part, decimal_part = num.to_s.split('.')
54
- ones_array = language == :hi ? ONES_HI : ONES_EN
55
- tens_array = language == :hi ? TENS_HI : TENS_EN
56
- units = language == :hi ? INDIAN_UNITS_HI : INDIAN_UNITS_EN
58
+ # Indian system (Hindi & English)
59
+ def to_words_indian(num, language: :hi)
60
+ num = num.to_i
61
+ return HINDI_NUMBERS_1_TO_99[num] if num <= 99
57
62
 
58
- integer_words = indian_units_to_words(integer_part.to_i, ones_array, tens_array, units)
59
- return integer_words if decimal_part.nil? || decimal_part.to_i.zero?
63
+ words = []
64
+ unit_index = 0
65
+
66
+ loop do
67
+ break if num.zero?
68
+ num, remainder = unit_index.zero? ? num.divmod(1000) : num.divmod(100)
69
+ part = convert_hindi_sub_thousand(remainder)
70
+ words.unshift("#{part} #{INDIAN_UNITS_HI[unit_index]}".strip) if remainder.positive?
71
+ unit_index += 1
72
+ end
60
73
 
61
- decimal_words = decimal_part.chars.map { |d| sub_thousand_to_words(d.to_i, ones_array, tens_array) }.join(' ')
62
- "#{integer_words} and #{decimal_words}"
74
+ words.join(' ').strip
63
75
  end
64
76
 
65
77
  private
66
78
 
79
+ def convert_hindi_sub_thousand(num)
80
+ return HINDI_NUMBERS_1_TO_99[num] if num <= 99
81
+
82
+ words = []
83
+ if num >= 100
84
+ words << "#{HINDI_NUMBERS_1_TO_99[num / 100]} सौ"
85
+ num %= 100
86
+ end
87
+ words << HINDI_NUMBERS_1_TO_99[num] if num.positive?
88
+ words.join(' ').strip
89
+ end
90
+
91
+ # Generic system (English or other)
67
92
  def to_words_generic(val, exp_hash, include_and, ones_array, tens_array)
68
93
  chunks = []
69
94
  while val.positive?
@@ -85,50 +110,13 @@ module NumWords
85
110
 
86
111
  words = []
87
112
  if val >= 100
88
- words << "#{ones_array[val / 100]} #{ones_array == ONES_HI ? 'सौ' : 'hundred'}"
113
+ words << "#{ones_array[val / 100]} #{ones_array == HINDI_NUMBERS_1_TO_99 ? 'सौ' : 'hundred'}"
89
114
  val %= 100
90
- words << 'and' if val.positive? && include_and && ones_array != ONES_HI
91
- end
92
-
93
- words << tens_array[val / 10] if val >= 20
94
- val %= 10 if val >= 20
95
- words << ones_array[val] if val.positive?
96
- words.join(' ').strip
97
- end
98
-
99
- def indian_units_to_words(num, ones_array, tens_array, units)
100
- num = num.to_i
101
- return ones_array[0] if num.zero?
102
-
103
- words = []
104
- unit_index = 0
105
-
106
- loop do
107
- break if num.zero?
108
- num, remainder = unit_index.zero? ? num.divmod(1000) : num.divmod(100)
109
- words.unshift("#{sub_thousand_to_words(remainder, ones_array, tens_array)} #{units[unit_index]}".strip) if remainder.positive?
110
- unit_index += 1
111
- end
112
-
113
- words.join(' ').strip
114
- end
115
-
116
- def sub_thousand_to_words(num, ones_array, tens_array)
117
- return ones_array[num] if num < 20
118
- return "#{ones_array[num / 100]} #{ones_array == ONES_HI ? 'सौ' : 'hundred'}" if num >= 100 && (num % 100).zero?
119
-
120
- words = []
121
- if num >= 100
122
- words << "#{ones_array[num / 100]} #{ones_array == ONES_HI ? 'सौ' : 'hundred'}"
123
- num %= 100
124
- end
125
-
126
- if num >= 20
127
- words << tens_array[num / 10]
128
- num %= 10
115
+ words << 'and' if val.positive? && include_and && ones_array != HINDI_NUMBERS_1_TO_99
129
116
  end
130
117
 
131
- words << ones_array[num] if num.positive?
118
+ words << tens_array[val] if val > 0 && val <= 99 && ones_array == HINDI_NUMBERS_1_TO_99
119
+ words << ones_array[val] if val > 0 && val < 20 && ones_array != HINDI_NUMBERS_1_TO_99
132
120
  words.join(' ').strip
133
121
  end
134
122
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module NumWords
4
- VERSION = "0.4.0"
4
+ VERSION = "0.5.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: num_words
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - mrmalvi