mirror of
https://github.com/rwinkhart/convertroman.git
synced 2026-09-05 16:37:22 -04:00
Do not return an error on out of bounds (return "OOB" string instead)
This commit is contained in:
+6
-13
@@ -1,17 +1,10 @@
|
|||||||
package convertroman
|
package convertroman
|
||||||
|
|
||||||
// Currently only supports Roman Numerals without viniculum (1-3999) and will throw an error for
|
// Currently only supports Roman Numerals without viniculum (1-3999; "OOB" is returned for values outside this range)
|
||||||
// numbers outside of that range. See here for details on viniculum:
|
// See here for details on viniculum:
|
||||||
// https://en.wikipedia.org/wiki/Roman_numerals#Large_numbers
|
// https://en.wikipedia.org/wiki/Roman_numerals#Large_numbers
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// IntegerOutOfBounds - error for when the integer provided is invalid and unable to be converted to a roman numeral
|
|
||||||
IntegerOutOfBounds = errors.New("integer must be between 1 and 3999")
|
|
||||||
|
|
||||||
// lookup arrays used for converting from an int to a roman numeral extremely quickly.
|
// lookup arrays used for converting from an int to a roman numeral extremely quickly.
|
||||||
// method from here: https://rosettacode.org/wiki/Roman_numerals/Encode#Go
|
// method from here: https://rosettacode.org/wiki/Roman_numerals/Encode#Go
|
||||||
r0 = [10]string{"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}
|
r0 = [10]string{"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}
|
||||||
@@ -21,13 +14,13 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// FromInt converts an integer value to a roman numeral string.
|
// FromInt converts an integer value to a roman numeral string.
|
||||||
// An error is returned if the integer is not between 1 and 3999.
|
// "OOB" is returned if the integer is not between 1 and 3999.
|
||||||
func FromInt(input int) (string, error) {
|
func FromInt(input int) string {
|
||||||
// ensure provided integer is within the valid range
|
// ensure provided integer is within the valid range
|
||||||
if input < 1 || input > 3999 {
|
if input < 1 || input > 3999 {
|
||||||
return "OOB", IntegerOutOfBounds
|
return "OOB"
|
||||||
}
|
}
|
||||||
|
|
||||||
// convert the integer to a roman numeral string and return it
|
// convert the integer to a roman numeral string and return it
|
||||||
return r3[input%1e4/1e3] + r2[input%1e3/1e2] + r1[input%100/10] + r0[input%10], nil
|
return r3[input%1e4/1e3] + r2[input%1e3/1e2] + r1[input%100/10] + r0[input%10]
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-16
@@ -26,35 +26,34 @@ var testCases = map[string]int{
|
|||||||
|
|
||||||
func TestFromInt(t *testing.T) {
|
func TestFromInt(t *testing.T) {
|
||||||
for expected, input := range testCases {
|
for expected, input := range testCases {
|
||||||
out, err := FromInt(input)
|
out := FromInt(input)
|
||||||
if err != nil {
|
if out == "OOB" {
|
||||||
t.Errorf("IntToString(%d) returned an error %s", input, err.Error())
|
t.Errorf("FromInt(%d) returned an OOB (out of bounds) error", input)
|
||||||
}
|
} else if out != expected {
|
||||||
if out != expected {
|
t.Errorf("FromInt(%d) = %s; want %s", input, out, expected)
|
||||||
t.Errorf("IntToString(%d) = %s; want %s", input, out, expected)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_, err := FromInt(100000)
|
out := FromInt(100000)
|
||||||
if err == nil {
|
if out != "OOB" {
|
||||||
t.Errorf("IntToString(%d) expected an error", 100000)
|
t.Errorf("FromInt(%d) expected an error", 100000)
|
||||||
}
|
}
|
||||||
_, err = FromInt(0)
|
out = FromInt(0)
|
||||||
if err == nil {
|
if out != "OOB" {
|
||||||
t.Errorf("IntToString(%d) expected an error", 0)
|
t.Errorf("FromInt(%d) expected an error", 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkFromInt(b *testing.B) {
|
func BenchmarkFromInt(b *testing.B) {
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
_, _ = FromInt(3999)
|
_ = FromInt(3999)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ExampleFromInt() {
|
func ExampleFromInt() {
|
||||||
roman, err := FromInt(4)
|
roman := FromInt(4)
|
||||||
if err != nil {
|
if roman == "OOB" {
|
||||||
panic(err)
|
panic("Input integer is out of bounds")
|
||||||
}
|
}
|
||||||
fmt.Println(roman == "IV") // True
|
fmt.Println(roman == "IV") // True
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user