KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > lowagie > text > factories > RomanNumberFactory


1 /*
2  * $Id: RomanNumberFactory.java 2685 2007-04-16 12:09:48Z blowagie $
3  * $Name$
4  *
5  * Copyright 2007 by Bruno Lowagie.
6  *
7  * The contents of this file are subject to the Mozilla Public License Version 1.1
8  * (the "License"); you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at http://www.mozilla.org/MPL/
10  *
11  * Software distributed under the License is distributed on an "AS IS" basis,
12  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13  * for the specific language governing rights and limitations under the License.
14  *
15  * The Original Code is 'iText, a free JAVA-PDF library'.
16  *
17  * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
18  * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
19  * All Rights Reserved.
20  * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
21  * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
22  *
23  * Contributor(s): all the names of the contributors are added in the source code
24  * where applicable.
25  *
26  * Alternatively, the contents of this file may be used under the terms of the
27  * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
28  * provisions of LGPL are applicable instead of those above. If you wish to
29  * allow use of your version of this file only under the terms of the LGPL
30  * License and not to allow others to use your version of this file under
31  * the MPL, indicate your decision by deleting the provisions above and
32  * replace them with the notice and other provisions required by the LGPL.
33  * If you do not delete the provisions above, a recipient may use your version
34  * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
35  *
36  * This library is free software; you can redistribute it and/or modify it
37  * under the terms of the MPL as stated above or under the terms of the GNU
38  * Library General Public License as published by the Free Software Foundation;
39  * either version 2 of the License, or any later version.
40  *
41  * This library is distributed in the hope that it will be useful, but WITHOUT
42  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
43  * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
44  * details.
45  *
46  * If you didn't download this code from the following link, you should check if
47  * you aren't using an obsolete version:
48  * http://www.lowagie.com/iText/
49  */

50 package com.lowagie.text.factories;
51 /**
52  * This class can produce String combinations representing a roman number.
53  */

54 public class RomanNumberFactory {
55     /**
56      * Helper class for Roman Digits
57      */

58     private static class RomanDigit {
59
60         /** part of a roman number */
61         public char digit;
62
63         /** value of the roman digit */
64         public int value;
65
66         /** can the digit be used as a prefix */
67         public boolean pre;
68
69         /**
70          * Constructs a roman digit
71          * @param digit the roman digit
72          * @param value the value
73          * @param pre can it be used as a prefix
74          */

75         RomanDigit(char digit, int value, boolean pre) {
76             this.digit = digit;
77             this.value = value;
78             this.pre = pre;
79         }
80     }
81     
82     /**
83      * Array with Roman digits.
84      */

85     private static final RomanDigit[] roman = {
86         new RomanDigit('m', 1000, false),
87         new RomanDigit('d', 500, false),
88         new RomanDigit('c', 100, true),
89         new RomanDigit('l', 50, false),
90         new RomanDigit('x', 10, true),
91         new RomanDigit('v', 5, false),
92         new RomanDigit('i', 1, true)
93     };
94     
95     /**
96      * Changes an int into a lower case roman number.
97      * @param index the original number
98      * @return the roman number (lower case)
99      */

100     public static final String JavaDoc getString(int index) {
101         StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
102
103         // lower than 0 ? Add minus
104
if (index < 0) {
105             buf.append('-');
106             index = -index;
107         }
108
109         // greater than 3000
110
if (index > 3000) {
111             buf.append('|');
112             buf.append(getString(index / 1000));
113             buf.append('|');
114             // remainder
115
index = index - (index / 1000) * 1000;
116         }
117
118         // number between 1 and 3000
119
int pos = 0;
120         while (true) {
121             // loop over the array with values for m-d-c-l-x-v-i
122
RomanDigit dig = roman[pos];
123             // adding as many digits as we can
124
while (index >= dig.value) {
125                 buf.append(dig.digit);
126                 index -= dig.value;
127             }
128             // we have the complete number
129
if (index <= 0) {
130                 break;
131             }
132             // look for the next digit that can be used in a special way
133
int j = pos;
134             while (!roman[++j].pre);
135
136             // does the special notation apply?
137
if (index + roman[j].value >= dig.value) {
138                 buf.append(roman[j].digit).append(dig.digit);
139                 index -= dig.value - roman[j].value;
140             }
141             pos++;
142         }
143         return buf.toString();
144     }
145     
146     /**
147      * Changes an int into a lower case roman number.
148      * @param index the original number
149      * @return the roman number (lower case)
150      */

151     public static final String JavaDoc getLowerCaseString(int index) {
152         return getString(index);
153     }
154     
155     /**
156      * Changes an int into an upper case roman number.
157      * @param index the original number
158      * @return the roman number (lower case)
159      */

160     public static final String JavaDoc getUpperCaseString(int index) {
161         return getString(index).toUpperCase();
162     }
163
164     /**
165      * Changes an int into a roman number.
166      * @param index the original number
167      * @return the roman number (lower case)
168      */

169     public static final String JavaDoc getString(int index, boolean lowercase) {
170         if (lowercase) {
171             return getLowerCaseString(index);
172         }
173         else {
174             return getUpperCaseString(index);
175         }
176     }
177     
178     /**
179      * Test this class using this main method.
180      */

181     public static void main(String JavaDoc[] args) {
182         for (int i = 1; i < 2000; i++) {
183             System.out.println(getString(i));
184         }
185     }
186 }
Popular Tags