numbers_and_words 1.0.0 → 1.0.2

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: f7503257030adb52e2ff1704101a18dce89c3f20adbf07f259f7483452098d3b
4
- data.tar.gz: ac2e88eb5d1d0fc1cd3aa2f7107dea6b83a8c96818280ff4e410f0e77055e656
3
+ metadata.gz: d612787bffd49001ca0a53639182c25282a62d6bce6ed64102e404a01bb0a42a
4
+ data.tar.gz: 7f66649bed55c361ff6ea98ea230601e2304302a5a23cbca3003419fdadbb83a
5
5
  SHA512:
6
- metadata.gz: b8f82e6d2cadd49ca7af046963f4db230d86511a0d09bf0b9404a8f1373df2a4076e418ec5645f14626082cc79ce64574d5c4a1beada1ac6412c24a633f873a5
7
- data.tar.gz: 1920bfb10e576382d1cdfc439ad870baf3d1e6db53193b29a63a05403c32340fb0e32dd9a7cf579b14f5a8702ec6b5874e36f02f9b69eb9e46174ff8d570fea3
6
+ metadata.gz: 32e0e1aff9acaba88b7f073ef25850e4cec84f872ee28f420ad2370c3b0d90d12e2190a30c88cee81f697729f38d9c3ca18bdfe05ff1ce6a8844e96efa1c7cd5
7
+ data.tar.gz: 2fee47dcc8cf1e9863f3061c20fa4112dcff5782b397c161e9a76f7a46b55da5e669a2772206e4aaa2f0e2e7c936bb9201ea130261a364c5514718f826d304fc
data/CHANGELOG.md CHANGED
@@ -1,8 +1,21 @@
1
- ## 1.1.0 (Next)
1
+ ## 1.0.3 (Next)
2
2
 
3
3
  ### Features
4
4
  * Your contribution here.
5
5
 
6
+ ## 1.0.2 (Next)
7
+
8
+ ### Features
9
+ * Add support for Dutch floating-point numbers. \[[#207](https://github.com/kslazarev/numbers_and_words/pull/207)\]
10
+
11
+ ## 1.0.1 (March 7, 2025)
12
+
13
+ ### Features
14
+ * Add support for Ruby 3.4. \[[#204](https://github.com/kslazarev/numbers_and_words/pull/204)\]
15
+
16
+ ### Bugs
17
+ * Fix a few cases in French concerning plurals and union word (mainly 71 and 81). \[[#203](https://github.com/kslazarev/numbers_and_words/pull/203)\]
18
+
6
19
  ## 1.0.0 (October 17, 2024)
7
20
 
8
21
  ### Features
@@ -146,7 +159,7 @@
146
159
  * Add Lithuanian language. \[[#77](https://github.com/kslazarev/numbers_and_words/pull/77)\] \([@miks](https://github.com/miks)\) \(assignee: [@miks](https://github.com/miks)\)
147
160
 
148
161
  ### Bugs
149
- * Fix latvian one hundread cases. \[[#81](https://github.com/kslazarev/numbers_and_words/pull/81)\] \([@miks](https://github.com/miks)\) \(assignee: [@miks](https://github.com/miks)\)
162
+ * Fix Latvian one hundred cases. \[[#81](https://github.com/kslazarev/numbers_and_words/pull/81)\] \([@miks](https://github.com/miks)\) \(assignee: [@miks](https://github.com/miks)\)
150
163
 
151
164
  ### Supports
152
165
  * Added @miks contacts to contributors list in README. \[[#79](https://github.com/kslazarev/numbers_and_words/issues/79)\] \([@kslazarev](https://github.com/kslazarev)\) \(assignee: [@miks](https://github.com/miks)\)
@@ -188,7 +201,7 @@
188
201
  ## 0.6.0 (March 25, 2013)
189
202
 
190
203
  ### Features
191
- * Support fractional form for Ukranian. \[[#54](https://github.com/kslazarev/numbers_and_words/issues/54)\] \([@kslazarev](https://github.com/kslazarev)\) \(assignee: [@Shk-Serji](https://github.com/Shk-Serji)\)
204
+ * Support fractional form for Ukrainian. \[[#54](https://github.com/kslazarev/numbers_and_words/issues/54)\] \([@kslazarev](https://github.com/kslazarev)\) \(assignee: [@Shk-Serji](https://github.com/Shk-Serji)\)
192
205
  * Support fractional form for Russian. \[[#53](https://github.com/kslazarev/numbers_and_words/issues/53)\] \([@kslazarev](https://github.com/kslazarev)\) \(assignee: [@kslazarev](https://github.com/kslazarev)\)
193
206
  * Added functionality for spanish . \[[#51](https://github.com/kslazarev/numbers_and_words/pull/51)\] \([@jaambros](https://github.com/jaambros)\) \(assignee: [@jaambros](https://github.com/jaambros)\)
194
207
  * Support ordinal form for English and Hungarian. \[[#50](https://github.com/kslazarev/numbers_and_words/issues/50)\] \([@eLod](https://github.com/eLod)\) \(assignee: [@eLod](https://github.com/eLod)\)
data/README.rdoc CHANGED
@@ -9,7 +9,7 @@ Spell out numbers in several languages using the I18n gem.
9
9
 
10
10
  Перевод чисел в слова при помощи библиотеки I18n.
11
11
 
12
- Converti les nombres en lettres en utilisant la librairie I18n.
12
+ Convertit les nombres en lettres en utilisant la librairie I18n.
13
13
 
14
14
  Számok betűvel írva az I18n könyvtár segítségével.
15
15
 
@@ -285,7 +285,7 @@ Deletrea números en varios idiomas utilizando la gema I18n.
285
285
  I18n.with_locale(:ru) { 1001.to_words gender: :neuter }
286
286
  => "одна тысяча одно"
287
287
 
288
- * Ukranian
288
+ * Ukrainian
289
289
 
290
290
  Change gender form: (gender: [:female || :male || :neuter])
291
291
 
@@ -373,6 +373,16 @@ Deletrea números en varios idiomas utilizando la gema I18n.
373
373
  I18n.with_locale(:da) { 1.to_words gender: :neuter }
374
374
  => "et"
375
375
 
376
+ * Dutch
377
+
378
+ Remove 'zero' from integral part of float: (remove_zero: [true || false])
379
+
380
+ I18n.with_locale(:nl) { 0.7.to_words remove_zero: true }
381
+ => "zeven tienden"
382
+
383
+ I18n.with_locale(:nl) { 0.7.to_words remove_zero: false }
384
+ => "nul komma zeven tienden"
385
+
376
386
  == Other options / Другие опции
377
387
 
378
388
  * Precision
@@ -8,3 +8,48 @@ nl:
8
8
  mega: [_, duizend, miljoen, miljard, biljoen, biljard, triljoen, triljard, septiljoen, octillion, noniljoen, decillion]
9
9
  union: en
10
10
  union2or3: ën
11
+ micro: [_, tienden, honderdsten, duizendsten, miljoensten, miljardsten, biljoensten, biljardsten, triljoensten, triljardsten, septiljoensten, octillionsten, noniljoensten, decillionsten]
12
+ tienden:
13
+ one: tiende
14
+ other: tienden
15
+ honderdsten:
16
+ one: honderdste
17
+ other: honderdsten
18
+ duizendsten:
19
+ one: duizendste
20
+ other: duizendsten
21
+ miljoensten:
22
+ one: miljoenste
23
+ other: miljoensten
24
+ miljardsten:
25
+ one: miljardste
26
+ other: miljardsten
27
+ biljoensten:
28
+ one: biljoenste
29
+ other: biljoensten
30
+ biljardsten:
31
+ one: biljardste
32
+ other: biljardsten
33
+ triljoensten:
34
+ one: triljoenste
35
+ other: triljoensten
36
+ triljardsten:
37
+ one: triljardste
38
+ other: triljardsten
39
+ septiljoensten:
40
+ one: septiljoenste
41
+ other: septiljoensten
42
+ octillionsten:
43
+ one: octillionste
44
+ other: octillionsten
45
+ noniljoensten:
46
+ one: noniljoenste
47
+ other: noniljoensten
48
+ decillionsten:
49
+ one: decillionste
50
+ other: decillionsten
51
+ micro_separator: komma
52
+ micro_prefix:
53
+ tens: tien
54
+ hundreds: honderd
55
+ union: ''
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NumbersAndWords
4
+ module Strategies
5
+ module ArrayJoiner
6
+ module Languages
7
+ class Nl < Base
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -14,6 +14,7 @@ require 'numbers_and_words/strategies/array_joiner/languages/ua'
14
14
  require 'numbers_and_words/strategies/array_joiner/languages/pt-BR'
15
15
  require 'numbers_and_words/strategies/array_joiner/languages/cs'
16
16
  require 'numbers_and_words/strategies/array_joiner/languages/vi'
17
+ require 'numbers_and_words/strategies/array_joiner/languages/nl'
17
18
 
18
19
  module NumbersAndWords
19
20
  module Strategies
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NumbersAndWords
4
+ module Strategies
5
+ module FiguresConverter
6
+ module Decorators
7
+ module Nl
8
+ class Base < Decorators::Base
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NumbersAndWords
4
+ module Strategies
5
+ module FiguresConverter
6
+ module Decorators
7
+ module Nl
8
+ class Fractional < Base
9
+ def run
10
+ @strategy.options.options[:fractional_numeral] = true
11
+ "#{super} #{fraction_significance}"
12
+ end
13
+
14
+ private
15
+
16
+ def fraction_significance
17
+ @strategy.translations.micros full_fraction.fraction_capacity, figures.join.to_i
18
+ end
19
+
20
+ def full_fraction
21
+ (0..zero_length).inject(figures.clone) { |result, _el| result.unshift 0 }.to_figures
22
+ end
23
+
24
+ def figures
25
+ @strategy.figures.reverse
26
+ end
27
+
28
+ def zero_length
29
+ fraction_length - figures.length
30
+ end
31
+
32
+ def fraction_length
33
+ @options[:fractional][:length].to_i
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NumbersAndWords
4
+ module Strategies
5
+ module FiguresConverter
6
+ module Decorators
7
+ module Nl
8
+ class Integral < Base
9
+ def run
10
+ return '' if @options[:remove_zero] && @strategy.figures.all?(&:zero?)
11
+
12
+ super
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'numbers_and_words/strategies/figures_converter/decorators/nl/base'
4
+ require 'numbers_and_words/strategies/figures_converter/decorators/nl/fractional'
5
+ require 'numbers_and_words/strategies/figures_converter/decorators/nl/integral'
@@ -11,6 +11,7 @@ require 'numbers_and_words/strategies/figures_converter/decorators/hu'
11
11
  require 'numbers_and_words/strategies/figures_converter/decorators/ua'
12
12
  require 'numbers_and_words/strategies/figures_converter/decorators/cs'
13
13
  require 'numbers_and_words/strategies/figures_converter/decorators/vi'
14
+ require 'numbers_and_words/strategies/figures_converter/decorators/nl'
14
15
 
15
16
  module NumbersAndWords
16
17
  module Strategies
@@ -14,7 +14,11 @@ module NumbersAndWords
14
14
  end
15
15
 
16
16
  def hundreds
17
- super({ pluralize: simple_number_to_words.empty? })
17
+ super({ pluralize: simple_number_to_words.empty? && (@parent_figures.nil? || @parent_figures.size == 3) })
18
+ end
19
+
20
+ def tens
21
+ super({ alone: @current_capacity&.positive? ? false : nil })
18
22
  end
19
23
 
20
24
  def megs
@@ -18,14 +18,34 @@ module NumbersAndWords
18
18
  capacity_words.empty? ? [] : [capacity_words, megs].join
19
19
  end
20
20
 
21
+ def ones(*args)
22
+ super({ fractional_numeral: @options.options[:fractional_numeral] }.merge(args.first || {}))
23
+ end
24
+
25
+ def tens_with_ones(*args)
26
+ super({ fractional_numeral: @options.options[:fractional_numeral] }.merge(args.first || {}))
27
+ end
28
+
21
29
  def simple_number_to_words
22
- if @figures.only_ones && @figures.ones == 1
30
+ if @figures.only_ones && @figures.ones == 1 && !@options.options[:fractional_numeral]
23
31
  [@translations.t(:loose_one)]
24
32
  else
25
33
  super
26
34
  end
27
35
  end
28
36
 
37
+ def zero
38
+ return nil if maybe_remove_zero
39
+
40
+ super
41
+ end
42
+
43
+ private
44
+
45
+ def maybe_remove_zero
46
+ @options.remove_zero&.result
47
+ end
48
+
29
49
  def number_without_capacity_to_words
30
50
  return super unless apply_tens_of_hundreds?
31
51
 
@@ -36,8 +56,6 @@ module NumbersAndWords
36
56
  [([base, translate(:hundreds, 1)] + simple_number_to_words).join]
37
57
  end
38
58
 
39
- private
40
-
41
59
  def apply_tens_of_hundreds?
42
60
  @options.tens_of_hundreds.result &&
43
61
  (1..9).cover?(figures.number_in_capacity(FiguresArray::THOUSAND_CAPACITY)) &&
@@ -7,19 +7,19 @@ module NumbersAndWords
7
7
  class Vi < Base
8
8
  def print_words
9
9
  value = super
10
- remove_billion_noice(value)
10
+ remove_billion_noise(value)
11
11
  end
12
12
 
13
13
  def strings_logic
14
14
  if fractional?
15
15
  if fraction_number_zeros_leading.zero?
16
- @options.options[:integeral] = true
17
- integeral_string_logic
16
+ @options.options[:integral] = true
17
+ integral_string_logic
18
18
  else
19
19
  fractional_with_zero_leading_string_logic
20
20
  end
21
21
  else
22
- integeral_string_logic
22
+ integral_string_logic
23
23
  end
24
24
  end
25
25
 
@@ -28,7 +28,7 @@ module NumbersAndWords
28
28
  (@figures + leading_zeros).map(&:to_words)
29
29
  end
30
30
 
31
- def integeral_string_logic
31
+ def integral_string_logic
32
32
  if @figures.capacity_count
33
33
  number_without_capacity_to_words + complex_number_to_words
34
34
  elsif hundreds?
@@ -66,7 +66,7 @@ module NumbersAndWords
66
66
  end
67
67
 
68
68
  def fractional?
69
- !@options.options[:fractional].nil? && !@options.options[:integeral]
69
+ !@options.options[:fractional].nil? && !@options.options[:integral]
70
70
  end
71
71
 
72
72
  def fraction_length
@@ -79,7 +79,7 @@ module NumbersAndWords
79
79
  fraction_length - @figures.length
80
80
  end
81
81
 
82
- def remove_billion_noice(value)
82
+ def remove_billion_noise(value)
83
83
  parts = value.split(billion_unit).map(&:strip)
84
84
  if value.end_with?(billion_unit)
85
85
  parts.insert(-1, billion_unit).join(' ')
@@ -14,11 +14,22 @@ module NumbersAndWords
14
14
  super
15
15
  end
16
16
 
17
- def tens_with_ones(numbers, options = {})
18
- return [tens(numbers[1] - 1, alone: false), teens(numbers)].join('-') if [7, 9].include? numbers[1]
17
+ def tens_with_teens(numbers)
18
+ number_ones, number_tens = numbers.first(2)
19
+ separator = number_tens == 7 && number_ones == 1 ? "-#{union}-" : '-'
20
+ [tens(number_tens - 1, alone: false), teens(numbers)].join(separator)
21
+ end
19
22
 
20
- separator = numbers[0] == 1 ? " #{union} " : '-'
21
- super(numbers, options.merge(separator:))
23
+ def tens_with_ones(numbers, options = {})
24
+ number_ones, number_tens = numbers
25
+ return tens_with_teens(numbers) if [7, 9].include?(number_tens)
26
+
27
+ separator = number_ones == 1 && number_tens != 8 ? " #{union} " : '-'
28
+ if number_tens == 8
29
+ [tens(number_tens, alone: false), ones(number_ones, options)].join(separator)
30
+ else
31
+ super(numbers, options.merge(separator:))
32
+ end
22
33
  end
23
34
 
24
35
  def hundreds(number, options = {})
@@ -4,9 +4,19 @@ module NumbersAndWords
4
4
  module Translations
5
5
  class Nl < Base
6
6
  include NumbersAndWords::Translations::Families::Latin
7
+ include NumbersAndWords::Translations::Extensions::FractionSignificance
7
8
 
8
- def tens_with_ones(numbers, _options = {})
9
- [ones(numbers[0]), tens(numbers[1])].join(union(numbers[0]))
9
+ def ones(number, options = {})
10
+ # In fractional context, use "een" instead of "één" for number 1
11
+ if number == 1 && options[:fractional_numeral]
12
+ t(:ones)[1] # "een" is at index 1 in the ones array
13
+ else
14
+ super
15
+ end
16
+ end
17
+
18
+ def tens_with_ones(numbers, options = {})
19
+ [ones(numbers[0], options), tens(numbers[1])].join(union(numbers[0]))
10
20
  end
11
21
 
12
22
  def hundreds(number, _options = {})
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module NumbersAndWords
4
- VERSION = '1.0.0'
4
+ VERSION = '1.0.2'
5
5
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: numbers_and_words
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kirill Lazarev
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-10-17 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: i18n
@@ -38,6 +37,20 @@ dependencies:
38
37
  - - "~>"
39
38
  - !ruby/object:Gem::Version
40
39
  version: '2'
40
+ - !ruby/object:Gem::Dependency
41
+ name: ostruct
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
41
54
  - !ruby/object:Gem::Dependency
42
55
  name: rake
43
56
  requirement: !ruby/object:Gem::Requirement
@@ -116,6 +129,7 @@ files:
116
129
  - lib/numbers_and_words/strategies/array_joiner/languages/families/base.rb
117
130
  - lib/numbers_and_words/strategies/array_joiner/languages/fr.rb
118
131
  - lib/numbers_and_words/strategies/array_joiner/languages/hu.rb
132
+ - lib/numbers_and_words/strategies/array_joiner/languages/nl.rb
119
133
  - lib/numbers_and_words/strategies/array_joiner/languages/pt-BR.rb
120
134
  - lib/numbers_and_words/strategies/array_joiner/languages/ru.rb
121
135
  - lib/numbers_and_words/strategies/array_joiner/languages/ua.rb
@@ -147,6 +161,10 @@ files:
147
161
  - lib/numbers_and_words/strategies/figures_converter/decorators/hu/base.rb
148
162
  - lib/numbers_and_words/strategies/figures_converter/decorators/hu/fractional.rb
149
163
  - lib/numbers_and_words/strategies/figures_converter/decorators/hu/integral.rb
164
+ - lib/numbers_and_words/strategies/figures_converter/decorators/nl.rb
165
+ - lib/numbers_and_words/strategies/figures_converter/decorators/nl/base.rb
166
+ - lib/numbers_and_words/strategies/figures_converter/decorators/nl/fractional.rb
167
+ - lib/numbers_and_words/strategies/figures_converter/decorators/nl/integral.rb
150
168
  - lib/numbers_and_words/strategies/figures_converter/decorators/pt-BR.rb
151
169
  - lib/numbers_and_words/strategies/figures_converter/decorators/pt-BR/base.rb
152
170
  - lib/numbers_and_words/strategies/figures_converter/decorators/pt-BR/fractional.rb
@@ -267,7 +285,6 @@ homepage: http://github.com/kslazarev/numbers_and_words
267
285
  licenses:
268
286
  - MIT
269
287
  metadata: {}
270
- post_install_message:
271
288
  rdoc_options: []
272
289
  require_paths:
273
290
  - lib
@@ -282,8 +299,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
282
299
  - !ruby/object:Gem::Version
283
300
  version: '0'
284
301
  requirements: []
285
- rubygems_version: 3.5.19
286
- signing_key:
302
+ rubygems_version: 3.6.9
287
303
  specification_version: 4
288
304
  summary: Spell out numbers in several languages
289
305
  test_files: []