/* * Ext GWT - Ext for GWT * Copyright(c) 2007-2009, Ext JS, LLC. * licensing@extjs.com * * http://extjs.com/license */ package com.extjs.gxt.ui.client.widget.form; import com.google.gwt.core.client.GWT; import com.google.gwt.i18n.client.NumberFormat; import com.google.gwt.i18n.client.constants.NumberConstants; /** * <code>PropertyEditory</code> that uses a {@link NumberFormat}. When * converting a Number to a String, if a format has not been specified, toString * will be called on the passed Number. When converting from a String to a * Number, the number type ({@link #setType(Class)} will be used to determine * the new number instance type. * * <pre><code> * NumberPropertyEditor editor = new NumberPropertyEditor(Integer.class); * </code></pre> * * @see NumberFormat */ public class NumberPropertyEditor implements PropertyEditor<Number> { protected NumberConstants numbers = (NumberConstants) GWT.create(NumberConstants.class); protected NumberFormat format; protected String alpahRegex = "[a-zA-Z]"; protected String currencySymbolRegex = "\\$"; protected String groupSeparator = numbers.groupingSeparator(); protected Class<?> type; private boolean stripCurrencySymbol; private boolean stripAlphas; private boolean stripGroupSeparator; /** * Creates a new number property editor with the default number type (Double). */ public NumberPropertyEditor() { } /** * Creates a new number property editor. * * @param type the number class (Short, Integer, Long, Float, Double) */ public NumberPropertyEditor(Class<?> type) { this.type = type; } /** * Creates a new number property editor. * * @param format the number format */ public NumberPropertyEditor(NumberFormat format) { this.format = format; } /** * Creates a new number property editor. * * @param pattern the number format pattern */ public NumberPropertyEditor(String pattern) { format = NumberFormat.getFormat(pattern); } public Number convertStringValue(String value) { // first try to create a typed value directly from the raw text try { if (type == Short.class) { return Short.valueOf(value); } else if (type == Integer.class) { return Integer.valueOf(value); } else if (type == Long.class) { return Long.valueOf(value); } else if (type == Float.class) { return Float.valueOf(value); } else { return Double.valueOf(value); } } catch (Exception e) { } // second, stip all unwanted characters String stripValue = stripValue(value); try { if (type == Short.class) { return Short.valueOf(stripValue); } else if (type == Integer.class) { return Integer.valueOf(stripValue); } else if (type == Long.class) { return Long.valueOf(stripValue); } else if (type == Float.class) { return Float.valueOf(stripValue); } else { return Double.valueOf(stripValue); } } catch (Exception e) { } // third try parsing with the formatter if (format != null) { Double d = format.parse(value); return returnTypedValue(d); } else { Double d = NumberFormat.getDecimalFormat().parse(value); return returnTypedValue(d); } } /** * Returns the editor's format. * * @return the number format */ public NumberFormat getFormat() { return format; } public String getStringValue(Number value) { if (format != null) { return format.format(value.doubleValue()); } return value.toString(); } /** * Returns the number class. * * @return the number class */ public Class<?> getType() { return type; } /** * Returns true if alpha characters are being removed. * * @return true if alpha characters are being removed */ public boolean isStripAlphas() { return stripAlphas; } /** * Returns true if the currency symbol is being removed. * * @return true if currency symbol is being removed */ public boolean isStripCurrencySymbol() { return stripCurrencySymbol; } /** * Returns true if the group separator is being removed before parsing a * string value. * * @return true if the group separator is being removed */ public boolean isStripGroupSeparator() { return stripGroupSeparator; } /** * Sets the editor's format. * * @param format the format */ public void setFormat(NumberFormat format) { this.format = format; } /** * True to remove alpha characters when parsing a string value (defaults to * false). * * @param stripAlphas true to remove all alpha characters */ public void setStripAlphas(boolean stripAlphas) { this.stripAlphas = stripAlphas; } /** * True to remove the currency symbol when parsing a string value (defaults to * false). * * @param stripCurrencySymbol true to the currency symbol */ public void setStripCurrencySymbol(boolean stripCurrencySymbol) { this.stripCurrencySymbol = stripCurrencySymbol; } /** * True to remove the group separator, as defined by GWT NumberConstants, when * parsing a string value (defaults to false). * * @param stripGroupSeparator true to remove the group separator */ public void setStripGroupSeparator(boolean stripGroupSeparator) { this.stripGroupSeparator = stripGroupSeparator; } /** * Sets the number type used when converting a string to a number. * * @param type the type (Short, Integer, Long, Float, Double) */ public void setType(Class<?> type) { this.type = type; } protected Number returnTypedValue(Number number) { if (type == Short.class) { return number.shortValue(); } else if (type == Integer.class) { return number.intValue(); } else if (type == Long.class) { return number.longValue(); } else if (type == Float.class) { return number.floatValue(); } return number; } protected String stripValue(String value) { if (stripCurrencySymbol) { value = value.replaceAll(currencySymbolRegex, ""); } if (stripAlphas) { value = value.replaceAll(alpahRegex, ""); } if (stripGroupSeparator) { value = value.replaceAll(groupSeparator, ""); } return value; } }