/* RoundingModes.java

	Purpose:
		
	Description:
		
	History:
		Fri May  4 12:24:48     2007, Created by tomyeh

Copyright (C) 2007 Potix Corporation. All Rights Reserved.

{{IS_RIGHT
	This program is distributed under LGPL Version 2.1 in the hope that
	it will be useful, but WITHOUT ANY WARRANTY.
}}IS_RIGHT
*/
package org.zkoss.math;

import java.math.BigDecimal;

/**
 * Utilities to handle the rounding mode.
 * @author tomyeh
 */
public class RoundingModes {
	private RoundingModes() {}

	/** Returns the name of the rounding mode.
	 * Possible values include 
<dl>
<dt>CEILING</dt>
	<dd>Rounding mode to round towards positive infinity.</dd>
<dt>DOWN</dt>
	<dd>Rounding mode to round towards zero.</dd>
<dt>FLOOR</dt>
	<dd>Rounding mode to round towards negative infinity.</dd>
<dt>HALF_DOWN</dt>
	<dd>Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down.</dd>
<dt>HALF_EVEN</dt>
	<dd>Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor.</dd>
<dt>HALF_UP</dt>
	<dd>Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up.</dd>
<dt>UNNECESSARY</dt>
	<dd>Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary.</dd>
<dt>UP</dt>
	<dd>Rounding mode to round away from zero.</dd>
</dl>
	 */
	public static final String toString(int roundingMode) {
		switch (roundingMode) {
		case BigDecimal.ROUND_CEILING: return "CEILING";
		case BigDecimal.ROUND_DOWN: return "DOWN";
		case BigDecimal.ROUND_FLOOR: return "FLOOR";
		case BigDecimal.ROUND_HALF_DOWN: return "HALF_DOWN";
		case BigDecimal.ROUND_HALF_EVEN: return "HALF_EVEN";
		case BigDecimal.ROUND_HALF_UP: return "HALF_UP";
		case BigDecimal.ROUND_UNNECESSARY: return "UNNECESSARY";
		case BigDecimal.ROUND_UP: return "UP";
		default:
			throw new IllegalArgumentException("Unknown rounding mode: "+roundingMode);
		}
	}
	/** Returns the rounding mode of the specified name.
	 *
	 * @param name the rounding mode's name. Allowed values include:
<dl>
<dt>CEILING</dt>
	<dd>Rounding mode to round towards positive infinity.</dd>
<dt>DOWN</dt>
	<dd>Rounding mode to round towards zero.</dd>
<dt>FLOOR</dt>
	<dd>Rounding mode to round towards negative infinity.</dd>
<dt>HALF_DOWN</dt>
	<dd>Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down.</dd>
<dt>HALF_EVEN</dt>
	<dd>Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor.</dd>
<dt>HALF_UP</dt>
	<dd>Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up.</dd>
<dt>UNNECESSARY</dt>
	<dd>Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary.</dd>
<dt>UP</dt>
	<dd>Rounding mode to round away from zero.</dd>
</dl>
	 */
	public static final int valueOf(String name) {
		name = name.toUpperCase();
		if ("CEILING".equals(name)) return BigDecimal.ROUND_CEILING;
		if ("DOWN".equals(name)) return BigDecimal.ROUND_DOWN;
		if ("FLOOR".equals(name)) return BigDecimal.ROUND_FLOOR;
		if ("HALF_DOWN".equals(name)) return BigDecimal.ROUND_HALF_DOWN;
		if ("HALF_EVEN".equals(name)) return BigDecimal.ROUND_HALF_EVEN;
		if ("HALF_UP".equals(name)) return BigDecimal.ROUND_HALF_UP;
		if ("UNNECESSARY".equals(name)) return BigDecimal.ROUND_UNNECESSARY;
		if ("UP".equals(name)) return BigDecimal.ROUND_UP;
		throw new IllegalArgumentException("Unknown rounding mode: "+name);
	}
}
