package cnp.ew.converter;
import cnp.ew.util.*;

import java.util.*;

class CpFractionToString implements CpToStringConverter
{

	// should the numerator include the integer portion of the number?
	public boolean includeIntegerPortion=false;

    CpDecimalToString numeratorConverter;
    String slashString;
    CpDecimalToString denominatorConverter;

	// if they specified an explicit denominator, this will be an integer
	// value greater than 0.
	int explicitDenominator = 0;

	int maxDenominatorDigits;


    long greatestCommonDivisor(long num1, long num2)
    {
        long a, b, r;

        a = num1;
        b = num2;
        while (b != 0) {
           r = a % b;
           a = b;
           b = r;
        }
        return a;
    }

    public void setNumeratorFormatString(String s)
    {
        numeratorConverter = new CpDecimalToString(s);
    }

    public void setSlashString(String s)
    {
        slashString = s;
    }

    public void setDenominatorFormatString(String s)
    {
        denominatorConverter = new CpDecimalToString(s);
        maxDenominatorDigits = s.length();
    }

    public void setLiteralDenominator(String s)
    {
        explicitDenominator = new Integer(s).intValue();
    }

	public String convert(Object o)

    {
        long numerator, denominator, divisor;
        double num = ((Number)o).doubleValue();

        if (!includeIntegerPortion) {
            num = num - Math.floor(num);
        }

        if (explicitDenominator != 0) {
            numerator = (long)Math.round(num * explicitDenominator);
            return numeratorConverter.convert(new Long(numerator)) + slashString + explicitDenominator;
        } else {
            denominator = 100000000;
            numerator = (long)(num * denominator);
        }
        divisor = greatestCommonDivisor(numerator, denominator);
        numerator /= divisor;
        denominator /= divisor;

        return numeratorConverter.convert(new Long(numerator)) + slashString + denominatorConverter.convert(new Long(denominator));

    }

    public void setFormatString(String s)
    {
    }

}
