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 +4 -4
- data/README.md +23 -2
- data/lib/num_words/converter.rb +50 -62
- data/lib/num_words/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0d117daa9a0ef678984f1a03b1b1456047e7ea67b4b13f610ab8cfb90634646
|
4
|
+
data.tar.gz: 4732ef7b105d1ae22b208529fe6098cbab124aef3547ee4650f3d24dd4b3a89e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
data/lib/num_words/converter.rb
CHANGED
@@ -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
|
10
|
-
|
11
|
-
|
12
|
-
|
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
|
-
|
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
|
-
#
|
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
|
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 ?
|
41
|
-
tens_array = language == :hi ?
|
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 (
|
52
|
-
def to_words_indian(num, language: :
|
53
|
-
|
54
|
-
|
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
|
-
|
59
|
-
|
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
|
-
|
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 ==
|
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 !=
|
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 <<
|
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
|
data/lib/num_words/version.rb
CHANGED