001 /*
002 // $Id: DecimalType.java 482 2012-01-05 23:27:27Z jhyde $
003 //
004 // Licensed to Julian Hyde under one or more contributor license
005 // agreements. See the NOTICE file distributed with this work for
006 // additional information regarding copyright ownership.
007 //
008 // Julian Hyde licenses this file to you under the Apache License,
009 // Version 2.0 (the "License"); you may not use this file except in
010 // compliance with the License. You may obtain a copy of the License at:
011 //
012 // http://www.apache.org/licenses/LICENSE-2.0
013 //
014 // Unless required by applicable law or agreed to in writing, software
015 // distributed under the License is distributed on an "AS IS" BASIS,
016 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017 // See the License for the specific language governing permissions and
018 // limitations under the License.
019 */
020 package org.olap4j.type;
021
022 /**
023 * Subclass of {@link NumericType} which guarantees fixed number of decimal
024 * places. In particular, a decimal with zero scale is an integer.
025 *
026 * @author jhyde
027 * @since May 3, 2005
028 * @version $Id: DecimalType.java 482 2012-01-05 23:27:27Z jhyde $
029 */
030 public class DecimalType extends NumericType {
031 private final int precision;
032 private final int scale;
033
034 /**
035 * Creates a decimal type with precision and scale.
036 *
037 * <p>Examples:<ul>
038 * <li>123.45 has precision 5, scale 2.
039 * <li>12,345,000 has precision 5, scale -3.
040 * </ul>
041 *
042 * <p>The largest value is 10 ^ (precision - scale). Hence the largest
043 * <code>DECIMAL(5, -3)</code> value is 10 ^ 8.
044 *
045 * @param precision Maximum number of decimal digits which a value of
046 * this type can have.
047 * Must be greater than zero.
048 * Use {@link Integer#MAX_VALUE} if the precision is unbounded.
049 * @param scale Number of digits to the right of the decimal point.
050 */
051 public DecimalType(int precision, int scale) {
052 super();
053 assert precision > 0 : "expected precision > 0";
054 this.precision = precision;
055 this.scale = scale;
056 }
057
058 /**
059 * Returns the maximum number of decimal digits which a value of
060 * this type can have.
061 *
062 * @return maximum precision allowed for values of this type
063 */
064 public int getPrecision() {
065 return precision;
066 }
067
068 /**
069 * Returns the number of digits to the right of the decimal point.
070 *
071 * @return number of digits to the right of the decimal point
072 */
073 public int getScale() {
074 return scale;
075 }
076
077 public String toString() {
078 return precision == Integer.MAX_VALUE
079 ? "DECIMAL(" + scale + ")"
080 : "DECIMAL(" + precision + ", " + scale + ")";
081 }
082 }
083
084 // End DecimalType.java