NumberFactory.java

package com.github.mygreen.cellformatter.number;


/**
 * 数値オブジェクトのファクトリクラス。
 *
 * @version 0.10
 * @author T.TSUCHIE
 *
 */
public abstract class NumberFactory {

    /**
     * 何も加工をしない数値のファクトリクラスの取得。
     * @return
     */
    public static NumberFactory nativeNumber() {
        return new NumberFactory() {

            @Override
            public FormattedNumber create(double value) {
                return new NativeNumber(value);
            }
        };
    }

    /**
     * 小数のファクトリクラスの取得
     * @param scale 小数の精度(桁数)。
     * @param useSeparator 区切り文字があるかどうか。
     * @param permilles 千分率の次数。ゼロと指定した場合は、{@code 1000^0}の意味。
     * @return {@link DecimalNumberFactory}のインスタンス。
     */
    public static DecimalNumberFactory decimalNumber(int scale, boolean useSeparator, final int permilles) {
        return new DecimalNumberFactory(scale, useSeparator, permilles);
    }

    /**
     * パーセントのファクトリクラスの取得
     * @param scale 小数の精度(桁数)。
     * @param useSeparator 区切り文字があるかどうか。
     * @param permilles 千分率の次数。ゼロと指定した場合は、{@code 1000^0}の意味。
     * @return {@link PercentNumberFactory}のインスタンス。
     */
    public static PercentNumberFactory percentNumber(int scale, boolean useSeparator, final int permilles) {
        return new PercentNumberFactory(scale, useSeparator, permilles);
    }

    /**
     * 指数のファクトリクラスの取得
     * @param scale 小数の精度(桁数)。
     * @param useSeparator 区切り文字があるかどうか。
     * @return {@link ExponentNumberFactory}のインスタンス。
     */
    public static ExponentNumberFactory exponentNumber(int scale, boolean useSeparator) {
        return new ExponentNumberFactory(scale, useSeparator);
    }

    /**
     * 分数のファクトリクラスの取得
     * @param denominator 分母の値
     * @param exactDenom 分母を直接指定かどうか
     * @param wholeType 帯分数形式かどうか
     * @return {@link FractionNumberFactory}のインスタンス。
     */
    public static FractionNumberFactory fractionNumber(final int denominator,
            final boolean exactDenom, final boolean wholeType) {
        return new FractionNumberFactory(denominator, exactDenom, wholeType);
    }

    /**
     * 数値オブジェクトのインスタンスを取得する。
     * @param value 変換元数値。
     * @return 組み立てた数値オブジェクト。
     */
    public abstract FormattedNumber create(double value);

    /**
     * 整数、小数の数値として作成するクラス。
     *
     */
    public static class DecimalNumberFactory extends NumberFactory {

        private int scale;

        private boolean useSeparator;

        private int permilles;

        public DecimalNumberFactory(final int scale, final boolean useSeparator, final int permilles) {
            this.scale = scale;
            this.useSeparator = useSeparator;
            this.permilles = permilles;
        }

        @Override
        public FormattedNumber create(double value) {
            FormattedNumber number = new DecimalNumber(value, scale, permilles);
            number.setUseSeparator(useSeparator);
            return number;
        }

    }

    /**
     * 指数として数値を作成するクラス。
     *
     */
    public static class ExponentNumberFactory extends NumberFactory {

        private int scale;

        private boolean useSeparator;

        public ExponentNumberFactory(final int scale, final boolean useSeparator) {
            this.scale = scale;
            this.useSeparator = useSeparator;
        }

        @Override
        public FormattedNumber create(double value) {
            FormattedNumber number = new ExponentNumber(value, scale);
            number.setUseSeparator(useSeparator);
            return number;
        }

    }

    /**
     * パーセントとして数値を作成するクラス。
     *
     */
    public static class PercentNumberFactory extends NumberFactory {

        private int scale;

        private boolean useSeparator;

        private int permilles;

        public PercentNumberFactory(final int scale, final boolean useSeparator, final int permilles) {
            this.scale = scale;
            this.useSeparator = useSeparator;
            this.permilles = permilles;
        }

        @Override
        public FormattedNumber create(double value) {
            FormattedNumber number = new PercentNumber(value, scale, permilles);
            number.setUseSeparator(useSeparator);
            return number;
        }

    }

    /**
     * 分数として数値を作成するクラス
     *
     */
    public static class FractionNumberFactory extends NumberFactory {

        /** 分母の値 */
        private int denominator;

        /** 分母を直接指定かどうか */
        private boolean exactDenom;

        /** 帯分数形式かどうか */
        private boolean wholeType;

        public FractionNumberFactory(final int denominator, final boolean exactDenom, final boolean wholeType) {
            this.denominator = denominator;
            this.exactDenom = exactDenom;
            this.wholeType = wholeType;
        }

        @Override
        public FormattedNumber create(double value) {

            FractionNumber number;
            if(exactDenom) {
                number = FractionNumber.createExactDenominator(value, denominator, wholeType);
            } else {
                number = FractionNumber.createMaxDenominator(value, denominator, wholeType);
            }

            return number;
        }



    }

}