# PDNumberFormatDictionary.java

    /*
     * 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.pdfbox.pdmodel.interactive.measurement;

    import org.apache.pdfbox.cos.COSDictionary;
    import org.apache.pdfbox.cos.COSName;
    import org.apache.pdfbox.pdmodel.common.COSObjectable;

    /**
     * This class represents a number format dictionary.
     *
     */
    public class PDNumberFormatDictionary implements COSObjectable
    {

        /**
         * The type of the dictionary.
         */
        public static final String TYPE = "NumberFormat";

        /**
         * Constant indicating that the label specified by U is a suffix to the value.
         */
        public static final String LABEL_SUFFIX_TO_VALUE = "S";
        /**
         * Constant indicating that the label specified by U is a postfix to the value.
         */
        public static final String LABEL_PREFIX_TO_VALUE = "P";

        /**
         * Constant for showing a fractional value as decimal to the precision specified by the D entry.
         */
        public static final String FRACTIONAL_DISPLAY_DECIMAL = "D";
        /**
         * Constant for showing a fractional value as a fraction with denominator specified by the D entry.
         */
        public static final String FRACTIONAL_DISPLAY_FRACTION = "F";
        /**
         * Constant for showing a fractional value without fractional part; round to the nearest whole unit.
         */
        public static final String FRACTIONAL_DISPLAY_ROUND = "R";
        /**
         * Constant for showing a fractional value without fractional part; truncate to achieve whole units.
         */
        public static final String FRACTIONAL_DISPLAY_TRUNCATE = "T";

        private final COSDictionary numberFormatDictionary;

        /**
         * Constructor.
         */
        public PDNumberFormatDictionary()
        {
            this.numberFormatDictionary = new COSDictionary();
            this.numberFormatDictionary.setName(COSName.TYPE, TYPE);
        }

        /**
         * Constructor.
         *
         * @param dictionary the corresponding dictionary
         */
        public PDNumberFormatDictionary(COSDictionary dictionary)
        {
            this.numberFormatDictionary = dictionary;
        }

        /**
         * This will return the dictionary.
         *
         * @return the number format dictionary
         */
        @Override
        public COSDictionary getCOSObject()
        {
            return this.numberFormatDictionary;
        }

        /**
         * This will return the type of the number format dictionary.
         * It must be "NumberFormat"
         *
         * @return the type
         */
        public String getType()
        {
            return TYPE;
        }

        /**
         * This will return the label for the units.
         *
         * @return the label for the units
         */
        public String getUnits()
        {
            return this.getCOSObject().getString("U");
        }

        /**
         * This will set the label for the units.
         *
         * @param units the label for the units
         */
        public void setUnits(String units)
        {
            this.getCOSObject().setString("U", units);
        }

        /**
         * This will return the conversion factor.
         *
         * @return the conversion factor
         */
        public float getConversionFactor()
        {
            return this.getCOSObject().getFloat("C");
        }

        /**
         * This will set the conversion factor.
         *
         * @param conversionFactor the conversion factor
         */
        public void setConversionFactor(float conversionFactor)
        {
            this.getCOSObject().setFloat("C", conversionFactor);
        }

        /**
         * This will return the value for the manner to display a fractional value.
         *
         * @return the manner to display a fractional value
         */
        public String getFractionalDisplay()
        {
            return this.getCOSObject().getString("F", FRACTIONAL_DISPLAY_DECIMAL);
        }

        /**
         * This will set the value for the manner to display a fractional value.
         * Allowed values are "D", "F", "R", "T" and null.
         *
         * @param fractionalDisplay the manner to display a fractional value
         */
        public void setFractionalDisplay(String fractionalDisplay)
        {
            if ((fractionalDisplay == null)
                || FRACTIONAL_DISPLAY_DECIMAL.equals(fractionalDisplay)
                || FRACTIONAL_DISPLAY_FRACTION.equals(fractionalDisplay)
                || FRACTIONAL_DISPLAY_ROUND.equals(fractionalDisplay)
                || FRACTIONAL_DISPLAY_TRUNCATE.equals(fractionalDisplay))
            {
                this.getCOSObject().setString("F", fractionalDisplay);
            }
            else
            {
                throw new IllegalArgumentException("Value must be \"D\", \"F\", \"R\", or \"T\", (or null).");
            }
        }

        /**
         * This will return the precision or denominator of a fractional amount.
         *
         * @return the precision or denominator
         */
        public int getDenominator()
        {
            return this.getCOSObject().getInt("D");
        }

        /**
         * This will set the precision or denominator of a fractional amount.
         *
         * @param denominator the precision or denominator
         */
        public void setDenominator(int denominator)
        {
            this.getCOSObject().setInt("D", denominator);
        }

        /**
         * This will return the value indication if the denominator of the fractional value is reduced/truncated .
         *
         * @return fd
         */
        public boolean isFD()
        {
            return this.getCOSObject().getBoolean("FD", false);
        }

        /**
         * This will set the value indication if the denominator of the fractional value is reduced/truncated .
         * The denominator may not be reduced/truncated if true
         * @param fd fd
         */
        public void setFD(boolean fd)
        {
            this.getCOSObject().setBoolean("FD", fd);
        }

        /**
         * This will return the text to be used between orders of thousands in display of numerical values.
         *
         * @return thousands separator
         */
        public String getThousandsSeparator()
        {
            return this.getCOSObject().getString("RT", ",");
        }

        /**
         * This will set the text to be used between orders of thousands in display of numerical values.
         *
         * @param thousandsSeparator thousands separator
         */
        public void setThousandsSeparator(String thousandsSeparator)
        {
            this.getCOSObject().setString("RT", thousandsSeparator);
        }

        /**
         * This will return the text to be used as the decimal point in displaying numerical values.
         *
         * @return decimal separator
         */
        public String getDecimalSeparator()
        {
            return this.getCOSObject().getString("RD", ".");
        }

        /**
         * This will set the text to be used as the decimal point in displaying numerical values.
         *
         * @param decimalSeparator decimal separator
         */
        public void setDecimalSeparator(String decimalSeparator)
        {
            this.getCOSObject().setString("RD", decimalSeparator);
        }

        /**
         * This will return the text to be concatenated to the left of the label specified by U.
         * @return label prefix
         */
        public String getLabelPrefixString()
        {
            return this.getCOSObject().getString("PS", " ");
        }

        /**
         * This will set the text to be concatenated to the left of the label specified by U.
         * @param labelPrefixString label prefix
         */
        public void setLabelPrefixString(String labelPrefixString)
        {
            this.getCOSObject().setString("PS", labelPrefixString);
        }

        /**
         * This will return the text to be concatenated after the label specified by U.
         *
         * @return label suffix
         */
        public String getLabelSuffixString()
        {
            return this.getCOSObject().getString("SS", " ");
        }

        /**
         * This will set the text to be concatenated after the label specified by U.
         *
         * @param labelSuffixString label suffix
         */
        public void setLabelSuffixString(String labelSuffixString)
        {
            this.getCOSObject().setString("SS", labelSuffixString);
        }

        /**
         * This will return a value indicating the ordering of the label specified by U to the calculated unit value.
         *
         * @return label position
         */
        public String getLabelPositionToValue()
        {
            return this.getCOSObject().getString("O", LABEL_SUFFIX_TO_VALUE);
        }

        /**
         * This will set the value indicating the ordering of the label specified by U to the calculated
         * unit value. Possible values are "S", "P" and null.
         *
         * @param labelPositionToValue label position
         */
        public void setLabelPositionToValue(String labelPositionToValue)
        {
            if ((labelPositionToValue == null)
                || LABEL_PREFIX_TO_VALUE.equals(labelPositionToValue)
                || LABEL_SUFFIX_TO_VALUE.equals(labelPositionToValue))
            {
                this.getCOSObject().setString("O", labelPositionToValue);
            }
            else
            {
                throw new IllegalArgumentException("Value must be \"S\", or \"P\" (or null).");
            }
        }

    }