SmartGWTで数値入力を行うためのコンポーネント

SmartGWTのフォーム上で任意スケールの数値入力を行うためのコンポーネントが用意されていなかったので作成しました。

このコンポーネントは、SmartGWTのcom.smartgwt.client.widgets.form.fields.TextItemクラスを拡張して実装しています。

setLengthメソッドで全体の桁数を設定します。
桁数には、入力された文字数そのもので評価され、符号や小数点などもカウントされるので注意が必要です。

setDecimalPadメソッドで小数点以下の桁数を設定します。

getValueメソッド、またはgetValueAsBigDecimalメソッドで入力された結果をBigDecimal型で取得します。
BigDecimal型への変換は、setDecimalPadメソッドで指定された小数点以下の桁数、setRoundingModeメソッドで指定された丸め方法で変換されます。
入力されたテキストが数値としてパースできなかった場合は、nullが返ります。

動作確認を行った環境:

Java

Java SE Development Kit 7

SmartGWT

6.1 PRO

ライセンス

NYSL

ダウンロード

BigDecimalItem.java.zip

// This software is distributed under the license of NYSL.
// ( http://www.kmonos.net/nysl/ )
package com.ria_lab.gwt.smartgwt.client.ui.form;

import java.math.BigDecimal;
import java.math.RoundingMode;

import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.i18n.client.NumberFormat;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.FormItemValueFormatter;
import com.smartgwt.client.widgets.form.FormItemValueParser;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.TextItem;

/**
 *	SmartGWTの com.smartgwt.client.widgets.form.DynamicForm で
 *	数値型(java.math.BigDecimal)を入力するためのコンポーネント
 */

public class BigDecimalItem extends TextItem {

	/** */
	private Integer scale;
	
	/** */
	private RoundingMode roundingMode = RoundingMode.DOWN;
	
	/** */
	private NumberFormat format;
	
	/** */
	private FormItemValueFormatter formatter =
			new FormItemValueFormatter() {
			
			@Override
			public String formatValue(Object value, Record record, DynamicForm form, FormItem item) {
				
				if (value == null) {
					return "";
				}
				
				try {
					return asBigDecimal(value.toString(), scale, roundingMode).toString();
				} catch (NumberFormatException e) {
					return value.toString();
				}
			}
		}; 
	
	/** */
	private FormItemValueParser parser = 
			new FormItemValueParser() {
				
				@Override
				public Object parseValue(String value, DynamicForm form, FormItem item) {
					
					if (value == null || value.trim().isEmpty()) {
						return null;
					}
					
					try {
						BigDecimal decimal = asBigDecimal(value.toString(), scale, roundingMode);
						return format == null ? decimal : format.format(decimal);
					} catch (NumberFormatException e) {
						return value;
					}
				}
			};

	/**
	 *	Constructor
	 *	
	 */
	public BigDecimalItem() {
		super();
		init();
	}

	/**
	 *	Constructor
	 *	
	 *	@param jsObj
	 */
	public BigDecimalItem(JavaScriptObject jsObj) {
		super(jsObj);
		init();
	}

	/**
	 *	Constructor
	 *	
	 *	@param name
	 */
	public BigDecimalItem(String name) {
		super(name);
		init();
	}

	/**
	 *	Constructor
	 *	
	 *	@param name
	 *	@param title
	 */
	public BigDecimalItem(String name, String title) {
		super(name, title);
		init();
	}
	
	/**
	 *	
	 */
	private void init() {
		
		setEditorValueFormatter(formatter);
		setValueFormatter(formatter);
		setEditorValueParser(parser);
		setKeyPressFilter("[0-9\\-\\+\\.]");
	}
	
	/**
	 *	@see com.smartgwt.client.widgets.form.fields.FormItem#setDecimalPad(java.lang.Integer)
	 */
	@Override
	public void setDecimalPad(Integer decimalPad) {
		
		if (decimalPad != null && decimalPad < 0) {
			throw new IllegalArgumentException();
		}
		
		super.setDecimalPrecision(decimalPad);
		scale = decimalPad;
		format = getNumberFormat(decimalPad);
	}
	
	/**
	 *	@return roundingMode
	 */
	public RoundingMode getRoundingMode() {
		return roundingMode;
	}

	/**
	 *	@param roundingMode roundingMode
	 */
	public void setRoundingMode(RoundingMode roundingMode) {
		
		if (roundingMode == null) {
			throw new IllegalArgumentException();
		}
		
		this.roundingMode = roundingMode;
	}

	/**
	 *	@see com.smartgwt.client.widgets.form.fields.FormItem#getValue()
	 */
	@Override
	public Object getValue() {
		return getValueAsBigDecimal();
	}
	
	/**
	 *	
	 *	@return
	 */
	public BigDecimal getValueAsBigDecimal() {
		
		String s = getValueAsString();
		if (s == null || s.trim().isEmpty()) {
			return null;
		}
		
		try {
			return asBigDecimal(s, scale, roundingMode);
		} catch (NumberFormatException e) {
			return null;
		}
	}
	
	/**
	 *	
	 *	@param s
	 *	@param scale
	 *	@param roundingMode
	 *	@return
	 */
	private static BigDecimal asBigDecimal(String s, Integer scale, RoundingMode roundingMode) {
		return scale == null ? new BigDecimal(s) : new BigDecimal(s).setScale(scale, roundingMode);
	}
	
	/**
	 *	
	 *	@param scale
	 *	@return
	 */
	private static NumberFormat getNumberFormat(Integer scale) {
		
		if (scale == null) {
			return NumberFormat.getFormat("0");
		}
		
		StringBuffer sb = new StringBuffer(scale == 0 ? "#0" : "#0.");
		for (int i = 0; i < scale; i++) {
			sb.append("0");
		}
		return NumberFormat.getFormat(sb.toString());
	}
}

makoto について

デジタルガジェット大好き!! 小さい機械を片手に、JavaとFlex、PHPなど、いろいろなプログラミング言語・環境を行ったり来たりしながらプログラムを書いています。 最近お気に入りな環境は、Visual StudioとFileMaker。
カテゴリー: Java, コードスニペット, 技術的なメモ タグ: , パーマリンク