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 +4 -4
- data/README.md +33 -4
- data/lib/numeri_romani/digits.rb +16 -2
- data/lib/numeri_romani/version.rb +1 -1
- data/lib/numeri_romani.rb +15 -7
- data/numeri_romani.gemspec +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d5ee7bc9fda2e4091a6f01cdc1e404d25061060
|
4
|
+
data.tar.gz: 4dddb21fe3840bf12c57aa2dc31a2aa664675070
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
+
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
|
data/lib/numeri_romani/digits.rb
CHANGED
@@ -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̅'
|
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
|
-
|
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
|
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
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
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
|
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
|
data/numeri_romani.gemspec
CHANGED
@@ -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
|
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.
|
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-
|
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
|
99
|
+
summary: Conversion between Decimals and Roman numbers in interval (1/12)-3_999_999(11/12)
|
100
100
|
test_files: []
|