numeri_romani 0.2.0 → 0.3.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
  SHA1:
3
- metadata.gz: 8ade03b2c587a395bdca23e658076da1888882da
4
- data.tar.gz: 87e101a9b9f99d9f110d9a54a70fd56f2f459269
3
+ metadata.gz: 5d5ee7bc9fda2e4091a6f01cdc1e404d25061060
4
+ data.tar.gz: 4dddb21fe3840bf12c57aa2dc31a2aa664675070
5
5
  SHA512:
6
- metadata.gz: 5bb59e7553ce3b684ff4f5ef5b8876e724febb9a5bcb434897e157dffdcbce790896f7eee5183fd34837f5f27e65296e68e911c7ec8f184edbc7a5aee9403389
7
- data.tar.gz: 2abf0cf00f9dc25b30e34bb7b6a8de284ab07dc3ac80e072d2e5584c81f17ab8af01c1d853abf57240a0aa89b34c13056849db66725429977bb9c8cfdeb993ed
6
+ metadata.gz: 9de2688ffb265e598367845b005be1a93b12f255270082c661786c3066fe890fcff0adb6e701da6936206ddb3fd8abf68ab1207db9a0e7761318f566d2fa5664
7
+ data.tar.gz: 9b438adf3442505873a4c98e70b0bd84c63093b52c935ef474d4d2fc382ca5f1d8351c5975730fd557793c006ccacd096cd74b2119ef10d9a534e8290966e762
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # NumeriRomani
2
2
 
3
- Numeri Romani (lat. roman numerals) - simple library for conversion integers to roman numerals and roman numerals to integers.
4
- Convert numbers within range of 1..3_999_999.
3
+ Numeri Romani (*lat. roman numerals*) - simple library for conversion integers to roman numerals and roman numerals to integers.
4
+ Convert numbers within range of [$$\frac{1}{12}$$; 3_999_999 $$\frac{11}{12}$$].
5
5
 
6
6
  ## Installation
7
7
 
@@ -22,8 +22,39 @@ Or install it yourself as:
22
22
  ## Usage
23
23
  ```ruby
24
24
  NumeriRomani.to_roman(521) # => 'DXXI'
25
+ NumeriRomani.to_roman(125_202) # => 'C̅X̅X̅V̅CCII'
26
+ NumeriRomani.to_roman(-1) # => ArgumentError: Number should be in interval [1..3_999_999]
27
+ NumeriRomani.to_roman(10**7) # => ArgumentError: Number should be in interval [1..3_999_999]
28
+ ```
29
+ ```ruby
25
30
  NumeriRomani.to_decimal('DXXI') # => 521
31
+ NumeriRomani.to_decimal('M̅M̅C̅C̅C̅X̅L̅V̅DCLXXVIII') # => 2_345_678
32
+ NumeriRomani.to_decimal('IIIXC') # => ArgumentError: Not valid roman number
26
33
  ````
34
+ Fractions:
35
+
36
+ | Roman numeral|Fraction |
37
+ |:------------:| :-------:|
38
+ | S |6/12 (1/2)|
39
+ | ⁙ (*****) | 5/12|
40
+ | ∷ (****) |4/12 (1/3)|
41
+ | ∴ (***) |3/12 (1/4)|
42
+ | ∶ (**) |2/12(1/6) |
43
+ | ⋅ (*) | 1/12|
44
+
45
+ ```ruby
46
+ NumeriRomani.to_decimal('IS') # => (3/2)
47
+ NumeriRomani.to_decimal('S⁙') # => (11/12)
48
+ NumeriRomani.to_decimal('S*****') # => (11/12)
49
+ ```
50
+
51
+ ```ruby
52
+ NumeriRomani.to_roman(3/4r) # => 'S∴'
53
+ NumeriRomani.to_roman(5.5) # => 'VS'
54
+ NumeriRomani.to_roman(10.11) # => 'X⋅' (0.11 ~ 1/12)
55
+ NumeriRomani.to_roman(10.13) # => 'X∶' (0.13 ~ 2/12)
56
+ NumeriRomani.to_roman(12.77) # => 'XIIS∷' (0.77 ~ 10/12)
57
+ ```
27
58
 
28
59
  ## Development
29
60
 
@@ -45,8 +76,6 @@ Here's some ideas (maybe also a roadmap for possible future versions of the libr
45
76
 
46
77
  * **Add Apostrophus system for big numbers.** For instance: CCC|ƆƆƆ|ƆƆƆ (C̅X̅X̅MMMCXXIII)
47
78
 
48
- * **Extend for fractions**. For instance S: - 2/3, S:·: - 11/12
49
-
50
79
  * **Add Validation module**.
51
80
 
52
81
  ## License
@@ -11,7 +11,7 @@ module NumeriRomani
11
11
  'X̅' => 10_000,
12
12
  'I̅X̅' => 9_000,
13
13
  'V̅' => 5_000,
14
- 'I̅V̅' => 4_000,
14
+ 'I̅V̅' => 4_000,
15
15
  'M' => 1_000,
16
16
  'CM' => 900,
17
17
  'D' => 500,
@@ -27,5 +27,19 @@ module NumeriRomani
27
27
  'I' => 1
28
28
  }.freeze
29
29
 
30
- REGEXP = /^((M\u0305){0,3})((D\u0305)?(C\u0305){0,3}|C\u0305D\u0305|C\u0305M\u0305)((L\u0305)?(X\u0305){0,3}|X\u0305L\u0305|X\u0305C\u0305)((V\u0305)?(I\u0305){0,3}|I\u0305V\u0305|I\u0305X\u0305)(M{0,3})(D?C{0,3}|C[DM])(L?X{0,3}|X[LC])(V?I{0,3}|I[VX])$/
30
+ FRACTIONS = {
31
+ 'S⁙' => 11/12r,
32
+ 'S∷' => 10/12r,
33
+ 'S∴' => 9/12r,
34
+ 'S∶' => 8/12r,
35
+ 'S⋅' => 7/12r,
36
+ 'S' => 6/12r,
37
+ '⁙' => 5/12r,
38
+ '∷' => 4/12r,
39
+ '∴' => 3/12r,
40
+ '∶' => 2/12r,
41
+ '⋅' => 1/12r,
42
+ }.freeze
43
+
44
+ REGEXP = /^((M\u0305){0,3})((D\u0305)?(C\u0305){0,3}|C\u0305D\u0305|C\u0305M\u0305)((L\u0305)?(X\u0305){0,3}|X\u0305L\u0305|X\u0305C\u0305)((V\u0305)?(I\u0305){0,3}|I\u0305V\u0305|I\u0305X\u0305)(M{0,3})(D?C{0,3}|C[DM])(L?X{0,3}|X[LC])(V?I{0,3}|I[VX])(#{FRACTIONS.keys.join('|')}|(S?\*{0,5}))?$/
31
45
  end
@@ -1,3 +1,3 @@
1
1
  module NumeriRomani
2
- VERSION = '0.2.0'
2
+ VERSION = '0.3.0'
3
3
  end
data/lib/numeri_romani.rb CHANGED
@@ -1,20 +1,28 @@
1
- require 'numeri_romani/version'
2
1
  require 'numeri_romani/digits'
3
2
 
4
3
  module NumeriRomani
5
4
  class << self
6
5
  def to_roman(decimal_number)
7
- raise ArgumentError.new('Number should be an Integer') unless decimal_number.is_a?(Integer)
8
- raise ArgumentError.new('Number should be in interval [1..3_999_999]') unless decimal_number.between?(1, 3_999_999)
9
- DIGITS.map do |letter, value|
10
- count, decimal_number = decimal_number.divmod(value)
6
+ unless [Integer, Float, Rational].include?(decimal_number.class)
7
+ raise ArgumentError.new('Number should be an Integer/Float/Rational')
8
+ end
9
+ unless decimal_number.between?(1/12r, 3_999_999 + 11/12r)
10
+ raise ArgumentError.new('Number should be in interval [(1/12)..3_999_999(11/12)]')
11
+ end
12
+ integer = decimal_number.to_i
13
+ fract = (decimal_number - integer).to_r
14
+ fract = Rational((12.0 * fract.numerator / fract.denominator).round, 12)
15
+ roman = DIGITS.map do |letter, value|
16
+ count, integer = integer.divmod(value)
11
17
  [letter * count]
12
- end.join
18
+ end
19
+ (roman << FRACTIONS.key(fract)).join
13
20
  end
14
21
 
15
22
  def to_decimal(roman_number)
16
23
  raise ArgumentError.new('Not valid roman number') unless roman_number.match?(REGEXP)
17
- roman_number.scan(/#{DIGITS.keys.join('|')}/).sum { |let| DIGITS[let] }
24
+ result = roman_number.scan(/#{(DIGITS.keys + FRACTIONS.keys).join('|')}/).sum { |let| DIGITS[let] || FRACTIONS[let] }
25
+ result + roman_number.count('*') * 1/12r
18
26
  end
19
27
  end
20
28
  end
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["Vasiliy Petrov"]
10
10
  spec.email = ["saugardas@yandex.ru"]
11
11
 
12
- spec.summary = %q{Conversion between Decimals and Roman Numbers}
12
+ spec.summary = %q{Conversion between Decimals and Roman numbers in interval (1/12)-3_999_999(11/12)}
13
13
  spec.description = %q{Conversion between Decimals and Roman Numbers}
14
14
  spec.homepage = "https://github.com/saugardas/numeri_romani"
15
15
  spec.license = "MIT"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: numeri_romani
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vasiliy Petrov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-05-08 00:00:00.000000000 Z
11
+ date: 2017-05-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -96,5 +96,5 @@ rubyforge_project:
96
96
  rubygems_version: 2.6.8
97
97
  signing_key:
98
98
  specification_version: 4
99
- summary: Conversion between Decimals and Roman Numbers
99
+ summary: Conversion between Decimals and Roman numbers in interval (1/12)-3_999_999(11/12)
100
100
  test_files: []