SmartGWTのフォーム上で任意スケールの数値入力を行うためのコンポーネントが用意されていなかったので作成しました。
このコンポーネントは、SmartGWTのcom.smartgwt.client.widgets.form.fields.TextItemクラスを拡張して実装しています。
setLengthメソッドで全体の桁数を設定します。
桁数には、入力された文字数そのもので評価され、符号や小数点などもカウントされるので注意が必要です。
setDecimalPadメソッドで小数点以下の桁数を設定します。
getValueメソッド、またはgetValueAsBigDecimalメソッドで入力された結果をBigDecimal型で取得します。
BigDecimal型への変換は、setDecimalPadメソッドで指定された小数点以下の桁数、setRoundingModeメソッドで指定された丸め方法で変換されます。
入力されたテキストが数値としてパースできなかった場合は、nullが返ります。
動作確認を行った環境:
Java SE Development Kit 7
// 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()); } }
Please give us your valuable comment