REFACTOR: apply DRY, remove magic numbers, add conversionRules domain
This commit is contained in:
parent
7eed3f8e2a
commit
b12821147d
1 changed files with 10 additions and 20 deletions
|
|
@ -1,25 +1,15 @@
|
||||||
String integerToRoman(int number) {
|
String integerToRoman(int number) {
|
||||||
const romanSymbols = {
|
const conversionRules = [(10, 'X'), (9, 'IX'), (5, 'V'), (4, 'IV'), (1, 'I')];
|
||||||
10: 'X',
|
|
||||||
9: 'IX',
|
|
||||||
8: 'VIII',
|
|
||||||
7: 'VII',
|
|
||||||
6: 'VI',
|
|
||||||
5: 'V',
|
|
||||||
1: 'I',
|
|
||||||
};
|
|
||||||
|
|
||||||
if (_isSubtractiveCase(number)) {
|
final result = StringBuffer();
|
||||||
return romanSymbols[1]! + romanSymbols[5]!;
|
var remaining = number;
|
||||||
|
|
||||||
|
for (final (value, symbol) in conversionRules) {
|
||||||
|
while (remaining >= value) {
|
||||||
|
result.write(symbol);
|
||||||
|
remaining -= value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_canRepeatSymbol(number)) {
|
return result.toString();
|
||||||
return romanSymbols[1]! * number;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return romanSymbols[number] ?? '';
|
|
||||||
}
|
|
||||||
|
|
||||||
bool _isSubtractiveCase(int number) => number == 4;
|
|
||||||
|
|
||||||
bool _canRepeatSymbol(int number) => number < 4;
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue