package org.civilian.text;
import org.civilian.util.Check;
/**
* NumberStyle allows for fine grained, locale dependent formatting of natural and decimal numbers.
* It uses the formatting symbols of a {@link NumberFormat}.
*/
public class NumberStyle
{
/**
* A NumberStyle which uses grouping and minDecimals = maxDecimals = 2.
*/
public static final NumberStyle DEFAULT = new NumberStyle(true, 2);
/**
* A NumberStyle which uses grouping, minDecimals = 0 and maxDecimals = Integer.MAX_VALUE.
*/
public static final NumberStyle UNLIMITED = new NumberStyle(true, 0, Integer.MAX_VALUE);
/**
* A NumberStyle which does not use grouping, minDecimals = 0 and maxDecimals = Integer.MAX_VALUE.
*/
public static final NumberStyle RAW = new NumberStyle(false, 0, Integer.MAX_VALUE);
public NumberStyle(boolean useGrouping, int decimals)
{
this(useGrouping, decimals, decimals);
}
public NumberStyle(boolean useGrouping, int minDecimals, int maxDecimals)
{
Check.greaterEquals(minDecimals, 0, "minDecimals");
Check.greaterEquals(minDecimals, minDecimals, "maxDecimals");
useGrouping_ = useGrouping;
minDecimals_ = minDecimals;
maxDecimals_ = maxDecimals;
}
/**
* Returns if grouping of the integer part of a number should be applied.
*/
public boolean useGrouping()
{
return useGrouping_;
}
/**
* Returns a new NumberStyle whose grouping flag has the given value.
*/
public NumberStyle useGrouping(boolean value)
{
return value != useGrouping_ ? new NumberStyle(value, minDecimals_, maxDecimals_) : this;
}
/**
* Returns how many decimal digits should at least be printed when formatting a decimal.
*/
public int minDecimals()
{
return minDecimals_;
}
/**
* Sets the number of minimal digits which should be printed when
* formatting a decimal. Must be 0 <= min <= maxDecimals().
*/
public NumberStyle minDecimals(int min)
{
return min != minDecimals_ ? new NumberStyle(useGrouping_, min, maxDecimals_) : this;
}
/**
* Returns how many decimal digits should at most be printed when formatting a decimal.
*/
public int maxDecimals()
{
return maxDecimals_;
}
/**
* Sets the number of maximal digits which should be printed when
* formatting a decimal.
*/
public NumberStyle maxDecimals(int max)
{
return max != maxDecimals_ ? new NumberStyle(useGrouping_, minDecimals_, max) : this;
}
/**
* Sets the number of minimal = maximal digits which should be printed when
* formatting a decimal.
*/
public NumberStyle decimals(int value)
{
return decimals(value, value);
}
/**
* Sets the number of minimal and maximal digits which should be printed when
* formatting a decimal.
*/
public NumberStyle decimals(int min, int max)
{
return (min != minDecimals_) || (max != maxDecimals_) ? new NumberStyle(useGrouping_, min, max) : this;
}
private boolean useGrouping_;
private int minDecimals_;
private int maxDecimals_;
}