46 lines
877 B
Dart
46 lines
877 B
Dart
class RomanNumeralInput {
|
|
static const _minValue = 1;
|
|
static const _maxValue = 3999;
|
|
|
|
final int value;
|
|
|
|
RomanNumeralInput(this.value) {
|
|
if (value < _minValue || value > _maxValue) {
|
|
throw ArgumentError(
|
|
'Roman numeral input must be between $_minValue and $_maxValue',
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
String integerToRoman(int number) {
|
|
final input = RomanNumeralInput(number);
|
|
|
|
const conversionRules = [
|
|
(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'),
|
|
];
|
|
|
|
final result = StringBuffer();
|
|
var remaining = input.value;
|
|
|
|
for (final (value, symbol) in conversionRules) {
|
|
while (remaining >= value) {
|
|
result.write(symbol);
|
|
remaining -= value;
|
|
}
|
|
}
|
|
|
|
return result.toString();
|
|
}
|