Convert integers to roman numerals in Go

Converting an integer to a Roman numeral can be achieved in Go with just a few lines of code

This approach uses a lookup table for the conversion between digit and numeral which helps us easily insert the appropriate numeral (or numerals) as many times as possible while reducing the target number by the same amount.

func integerToRoman(number int) string {
	maxRomanNumber := 3999
	if number > maxRomanNumber {
		return strconv.Itoa(number)
	}

	conversions := []struct {
		value int
		digit string
	}{
		{1000, "M"},
		{900, "CM"},
		{500, "D"},
		{400, "CD"},
		{100, "C"},
		{90, "XC"},
		{50, "L"},
		{40, "XL"},
		{10, "X"},
		{9, "IX"},
		{5, "V"},
		{4, "IV"},
		{1, "I"},
	}

	var roman strings.Builder
	for _, conversion := range conversions {
		for number >= conversion.value {
			roman.WriteString(conversion.digit)
			number -= conversion.value
		}
	}

	return roman.String()
}

The Roman numeral system consists of the symbols which are I, V, X, L, C, D, and M which stand for 1, 5, 10, 50, 100, 500, and 1,000 respectively. These symbols are combined through a simple formula to produce other values. A symbol placed after another of equal or greater value adds its value (e.g., III = 3 and XX = 20), while symbol placed before one of greater value subtracts its value (e.g., IV = 4, XL = 40). Numbers greater than 3,999 cannot be represented in the Roman system so they are returned as stringified integers.

func main() {
	fmt.Println(integerToRoman(300))
	fmt.Println(integerToRoman(45))
	fmt.Println(integerToRoman(1238))
	fmt.Println(integerToRoman(3259))
}
Output
CCC
XLV
MCCXXXVIII
MMMCCLIX

Thanks for reading, and happy coding!