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 +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: []
|