Thanks for the ideas.  Here is my implementation.  I split it into two
classes since I may want to use the CurrencyConverter separately.  In
my initial testing it works well, but I haven't tested
convertToObject().  Let me know if anyone sees any issues or has
suggested improvements:

public class CurrencyConverter extends AbstractNumberConverter {
    private static final long serialVersionUID = 1L;

    public CurrencyConverter() {
    }

    @Override
    public NumberFormat getNumberFormat(Locale locale) {
                return NumberFormat.getCurrencyInstance(locale);
    }

    @Override
    public Class getTargetType() {
        return Double.class;
    }

    public Object convertToObject(String value, Locale locale) {
        // string to double.
        try {
            return getNumberFormat(locale).parse(value).doubleValue();
        } catch (ParseException ex) {
            throw new WicketRuntimeException("exception when trying to
parse currency value:" + ex.getMessage());
        }
    }

    @Override
    public String convertToString(Object value, Locale locale) {
        // double to string
        return getNumberFormat(locale).format(value);
    }

}

public class CurrencyLabel extends Label {
        private static final long serialVersionUID = 1L;

        public CurrencyLabel(String id) {
                this(id,null);
        }

        public CurrencyLabel(String id, IModel model) {
                super(id,model);
        }
        
        public IConverter getConverter(Class type) {
                return new CurrencyConverter();
        }

}

Anyone can feel free to use this or add it to Wicket core.

Tauren



On 10/5/07, Eelco Hillenius <[EMAIL PROTECTED]> wrote:
> >                 Label dbl = new Label("dbllbl",""+x){
>
> Why pass in a string? Better is to do new Label("foo", new Model(x));
>
> >                         @Override
> >                         protected void onComponentTagBody(final 
> > MarkupStream markupStream, final
> > ComponentTag openTag)
> >                         {
> >                                 Object val = 
> > getConverter().convert(getModelObjectAsString(),
>
> If you are merely displaying the value, you don't need to convert.
> What this line above does - if you'd pass in a model that produces a
> number) is convert from a number to a string (using the converter,
> this is in getModelObjectAsString) and back again. You can just do
> Object val = getModelObject().
>
> Alternatives:
> 1) Wrap the model (decorator pattern) so that it returns the formatted value.
> 2) Use a custom converter like:
>
>   new Label("foo", new Model(x)) {
>     public IConverter getConverter(Class type) {
>       return new AbstractNumberConverter() {
>         public NumberFormat getNumberFormat(Locale locale) {
>           return NumberFormat.getCurrencyInstance();
>         }
>       }
>     }
>   }
>
>
> Eelco
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to