/*
 * NumberUtil.java
 * Copyright (C) 2008 Cyber Beans Corporation. All rights reserved.
 */
package jp.co.cybec.cb3.util;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;

 /**
  * 数字ユーティリティクラス。
  * @author Jianming Guo
  */
public class NumberUtil {

	/**
	 * 文字列の小数点後の桁数を取得します。
	 *
	 * @param value  文字列
	 * @return 小数点後の桁数
	 */
	public static int getFractionDigits(String value) {
		int  place = 0;

		if(value != null && value.length() > 0){
			String strVal = value.trim();
			place = strVal.lastIndexOf('.') == -1 ? 0 : (strVal.length() - strVal.lastIndexOf('.') - 1);
		}

		return place;
	}

	/**
	 * 文字列をBigDecimal型数字にパースします。
	 *
	 * @param pattern 文字列のフォーマット
	 * @param value   文字列
	 * @return パース後のBigDecimal型数字
	 * @throws NullPointerException <code>pattern</code>が<code>null</code>の場合に発生します。
	 * @throws IllegalArgumentException 指定された引数でフォーマットできない場合に発生します。
	 * @throws ParseException 指定された<code>value</code>が正しくない場合に発生します。
	 */
	public static BigDecimal parseBigDecimal(String pattern, String value) throws NullPointerException, IllegalArgumentException, ParseException {

		DecimalFormat df = new DecimalFormat();
		df.applyPattern(pattern);
		df.setParseBigDecimal(true);

		return (BigDecimal)df.parse(value);
	}

	/**
	 * 数字文字列をフォーマットします。
	 *
	 * @param pattern 文字列のフォーマット
	 * @param value   文字列
	 * @return フォーマット後の文字列
	 * @throws NullPointerException <code>pattern</code>が<code>null</code>の場合に発生します。
	 * @throws IllegalArgumentException 指定された引数でフォーマットできない場合に発生します。
	 */
	public static String formatNumber(String pattern, String value) throws NullPointerException, IllegalArgumentException {
		DecimalFormat df = new DecimalFormat();
		df.applyPattern(pattern);

		return  df.format(new BigDecimal(value));
	}

	/**
	 * BigDecimal型数字を指定の小数桁数の文字列に変換します。
	 * ※ 四捨五入
	 *
	 * @param value BigDecimal型数字
	 * @param fractionDigits 小数の桁数
	 * @return 変換後の文字列
	 */
	public static String numberToString(BigDecimal value, int fractionDigits) {
		if (value == null) {
			return null;
		}

		DecimalFormat df = new DecimalFormat();
		df.setGroupingUsed(false);
		df.setMaximumFractionDigits(fractionDigits);

		return df.format(value);
	}
}
