numeri_romani 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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: []