private static String toRomanNumber()

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();
    }