You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by Jered Myers <je...@maplewoodsoftware.com> on 2012/11/07 02:54:52 UTC

Currency Converter

I am updating my application from Wicket 1.4.18 to Wicket 6.2 and my 
currency converter no longer works once I add the generics into it. I am 
using the converter to allow the user to enter an amount of money.  The 
problem is that when something like "asdfasdf" is entered, I get an 
exception like this:

java.lang.ClassCastException: java.lang.String cannot be cast to 
java.lang.Number
at 
org.apache.wicket.util.convert.converter.AbstractNumberConverter.convertToString(AbstractNumberConverter.java:31)

Is there a currency converter already in Wicket that I haven't seen?  
Does anybody have a good example of a working converter for currency in 
Wicket 6.x?

Here is my code from 1.4 that was working:

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) {

         try {
             if(value.startsWith("$")) {
                 value = value.replace("$", "");
             }
             value = String.valueOf( Double.valueOf( value ) * 100 );
             value = "$" + value;

             return getNumberFormat(locale).parse(value).doubleValue();
         } catch (ParseException ex) {
             ConversionException conv = new ConversionException("'" + 
value + "' is not a valid dollar amount.");
             conv.setResourceKey("CurrencyConverter");
             throw conv;
         } catch(NumberFormatException ex){
             ConversionException conv = new ConversionException("'" + 
value + "' is not a valid dollar amount.");
             conv.setResourceKey("CurrencyConverter");
             throw conv;
         }
     }

     @Override
     public String convertToString(Object value, Locale locale) {
         if( value == null )
             return null;

         int cents;

         if( value instanceof Integer ) {
             cents = (Integer) value;
             return getNumberFormat(locale).format((double) cents / 100.0);
         } else if( value instanceof String     ) {
             cents = Integer.parseInt( (String) value );
             return getNumberFormat(locale).format((double) cents / 100.0);

         }

         return value.toString();
     }

}

-- 
Jered Myers


Re: Currency Converter

Posted by Martin Grigorov <mg...@apache.org>.
Hi,

You don't use the generics.
I expect to see : extends AbstractNumberConverter<Double> and later
convertTo methods work with Double too.
In your #convertToString() I see no call to super.convertToString() but the
exception says that it fails at AbstractNumberConverter.java:**31 so your
override actually doesn't work.


On Wed, Nov 7, 2012 at 3:54 AM, Jered Myers <je...@maplewoodsoftware.com>wrote:

> I am updating my application from Wicket 1.4.18 to Wicket 6.2 and my
> currency converter no longer works once I add the generics into it. I am
> using the converter to allow the user to enter an amount of money.  The
> problem is that when something like "asdfasdf" is entered, I get an
> exception like this:
>
> java.lang.ClassCastException: java.lang.String cannot be cast to
> java.lang.Number
> at org.apache.wicket.util.**convert.converter.**AbstractNumberConverter.**
> convertToString(**AbstractNumberConverter.java:**31)
>
> Is there a currency converter already in Wicket that I haven't seen?  Does
> anybody have a good example of a working converter for currency in Wicket
> 6.x?
>
> Here is my code from 1.4 that was working:
>
> 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) {
>
>         try {
>             if(value.startsWith("$")) {
>                 value = value.replace("$", "");
>             }
>             value = String.valueOf( Double.valueOf( value ) * 100 );
>             value = "$" + value;
>
>             return getNumberFormat(locale).parse(**value).doubleValue();
>         } catch (ParseException ex) {
>             ConversionException conv = new ConversionException("'" + value
> + "' is not a valid dollar amount.");
>             conv.setResourceKey("**CurrencyConverter");
>             throw conv;
>         } catch(NumberFormatException ex){
>             ConversionException conv = new ConversionException("'" + value
> + "' is not a valid dollar amount.");
>             conv.setResourceKey("**CurrencyConverter");
>             throw conv;
>         }
>     }
>
>     @Override
>     public String convertToString(Object value, Locale locale) {
>         if( value == null )
>             return null;
>
>         int cents;
>
>         if( value instanceof Integer ) {
>             cents = (Integer) value;
>             return getNumberFormat(locale).**format((double) cents /
> 100.0);
>         } else if( value instanceof String     ) {
>             cents = Integer.parseInt( (String) value );
>             return getNumberFormat(locale).**format((double) cents /
> 100.0);
>
>         }
>
>         return value.toString();
>     }
>
> }
>
> --
> Jered Myers
>
>


-- 
Martin Grigorov
jWeekend
Training, Consulting, Development
http://jWeekend.com <http://jweekend.com/>