| /* |
| * ==================================================================== |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * ==================================================================== |
| */ |
| |
| package org.apache.poi.hwpf.converter; |
| |
| import java.util.Locale; |
| |
| import org.apache.poi.util.Beta; |
| |
| /** |
| * Utility class to translate numbers in letters, usually for lists. |
| * |
| * @author Sergey Vladimirov (vlsergey {at} gmail {dot} com) |
| */ |
| @Beta |
| public final class NumberFormatter { |
| private static final String[] ROMAN_LETTERS = { "m", "cm", "d", "cd", "c", |
| "xc", "l", "xl", "x", "ix", "v", "iv", "i" }; |
| |
| private static final int[] ROMAN_VALUES = { 1000, 900, 500, 400, 100, 90, |
| 50, 40, 10, 9, 5, 4, 1 }; |
| |
| private static final int T_ARABIC = 0; |
| private static final int T_LOWER_LETTER = 4; |
| private static final int T_LOWER_ROMAN = 2; |
| private static final int T_ORDINAL = 5; |
| private static final int T_UPPER_LETTER = 3; |
| private static final int T_UPPER_ROMAN = 1; |
| |
| public static String getNumber( int num, int style ) |
| { |
| switch ( style ) |
| { |
| case T_UPPER_ROMAN: |
| return toRoman( num ).toUpperCase(Locale.ROOT); |
| case T_LOWER_ROMAN: |
| return toRoman( num ); |
| case T_UPPER_LETTER: |
| return toLetters( num ).toUpperCase(Locale.ROOT); |
| case T_LOWER_LETTER: |
| return toLetters( num ); |
| case T_ARABIC: |
| case T_ORDINAL: |
| default: |
| return String.valueOf( num ); |
| } |
| } |
| |
| private static String toLetters(int number) { |
| if ( number <= 0 ) { |
| throw new IllegalArgumentException( "Unsupported number: " + number ); |
| } |
| |
| int num = number; |
| final int radix = 26; |
| |
| char[] buf = new char[33]; |
| int charPos = buf.length; |
| |
| while (num > 0) { |
| num--; // 1 => a, not 0 => a |
| int remainder = num % radix; |
| buf[--charPos] = (char)('a'+remainder); |
| num = (num - remainder) / radix; |
| } |
| |
| return new String(buf, charPos, (buf.length - charPos)); |
| } |
| |
| private static String toRoman( int number ) |
| { |
| if ( number <= 0 ) |
| throw new IllegalArgumentException( "Unsupported number: " + number ); |
| |
| StringBuilder result = new StringBuilder(); |
| |
| for ( int i = 0; i < ROMAN_LETTERS.length; i++ ) |
| { |
| String letter = ROMAN_LETTERS[i]; |
| int value = ROMAN_VALUES[i]; |
| while ( number >= value ) |
| { |
| number -= value; |
| result.append( letter ); |
| } |
| } |
| return result.toString(); |
| } |
| } |