in freemarker-docgen-core/src/main/java/org/freemarker/docgen/core/TextUtil.java [150:209]
private static String toRomanNumber(int n, char[] romanDigits) {
// We fetch the decimal digits from right to left.
// The res buffer will contain the Roman number *backwards*, and thus it
// also will contain the Roman "digits" backwards, like 7 will be "IIV".
// At the very end the buffer is reversed.
if (n > 3999) {
throw new IllegalArgumentException("toRomanNumber only supports "
+ "numbers in the [1..3999] range, but the number was "
+ n + ".");
}
StringBuilder res = new StringBuilder();
int base = 0;
while (n != 0) {
int digit = n % 10;
n /= 10;
if (digit != 0) {
switch (digit) {
case 3:
res.append(romanDigits[base]);
// falls through
case 2:
res.append(romanDigits[base]);
// falls through
case 1:
res.append(romanDigits[base]);
break;
case 4:
res.append(romanDigits[base + 1])
.append(romanDigits[base]);
break;
case 8:
res.append(romanDigits[base]);
// falls through
case 7:
res.append(romanDigits[base]);
// falls through
case 6:
res.append(romanDigits[base]);
// falls through
case 5:
res.append(romanDigits[base + 1]);
break;
case 9:
res.append(romanDigits[base + 2]);
res.append(romanDigits[base]);
break;
default:
throw new BugException("Unexpected branch");
}
}
base += 2;
}
return res.reverse().toString();
}