    001/*
    002 * Licensed to the Apache Software Foundation (ASF) under one or more
    003 * contributor license agreements.  See the NOTICE file distributed with
    004 * this work for additional information regarding copyright ownership.
    005 * The ASF licenses this file to You under the Apache License, Version 2.0
    006 * (the "License"); you may not use this file except in compliance with
    007 * the License.  You may obtain a copy of the License at
    008 *
    009 *      http://www.apache.org/licenses/LICENSE-2.0
    010 *
    011 * Unless required by applicable law or agreed to in writing, software
    012 * distributed under the License is distributed on an "AS IS" BASIS,
    013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    014 * See the License for the specific language governing permissions and
    015 * limitations under the License.
    016 */
    017
    018package org.apache.commons.beanutils.locale.converters;
    019
    020import org.apache.commons.beanutils.locale.BaseLocaleConverter;
    021import org.apache.commons.logging.Log;
    022import org.apache.commons.logging.LogFactory;
    023
    024import java.text.DecimalFormat;
    025import java.text.ParseException;
    026import java.util.Locale;
    027
    028
    029/**
    030 * <p>Standard {@link org.apache.commons.beanutils.locale.LocaleConverter}
    031 * implementation that converts an incoming
    032 * locale-sensitive String into a <code>java.lang.Number</code> object,
    033 * optionally using a default value or throwing a
    034 * {@link org.apache.commons.beanutils.ConversionException}
    035 * if a conversion error occurs.</p>
    036 *
    037 * @since 1.7
    038 * @version $Id$
    039 */
    040
    041public class DecimalLocaleConverter extends BaseLocaleConverter {
    042
    043
    044    // ----------------------------------------------------- Instance Variables
    045
    046    /** All logging goes through this logger */
    047    private final Log log = LogFactory.getLog(DecimalLocaleConverter.class);
    048
    049    // ----------------------------------------------------------- Constructors
    050
    051    /**
    052     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
    053     * that will throw a {@link org.apache.commons.beanutils.ConversionException}
    054     * if a conversion error occurs. The locale is the default locale for
    055     * this instance of the Java Virtual Machine and an unlocalized pattern is used
    056     * for the convertion.
    057     *
    058     */
    059    public DecimalLocaleConverter() {
    060
    061        this(false);
    062    }
    063
    064    /**
    065     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
    066     * that will throw a {@link org.apache.commons.beanutils.ConversionException}
    067     * if a conversion error occurs. The locale is the default locale for
    068     * this instance of the Java Virtual Machine.
    069     *
    070     * @param locPattern    Indicate whether the pattern is localized or not
    071     */
    072    public DecimalLocaleConverter(final boolean locPattern) {
    073
    074        this(Locale.getDefault(), locPattern);
    075    }
    076
    077    /**
    078     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
    079     * that will throw a {@link org.apache.commons.beanutils.ConversionException}
    080     * if a conversion error occurs. An unlocalized pattern is used for the convertion.
    081     *
    082     * @param locale        The locale
    083     */
    084    public DecimalLocaleConverter(final Locale locale) {
    085
    086        this(locale, false);
    087    }
    088
    089    /**
    090     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
    091     * that will throw a {@link org.apache.commons.beanutils.ConversionException}
    092     * if a conversion error occurs.
    093     *
    094     * @param locale        The locale
    095     * @param locPattern    Indicate whether the pattern is localized or not
    096     */
    097    public DecimalLocaleConverter(final Locale locale, final boolean locPattern) {
    098
    099        this(locale, (String) null, locPattern);
    100    }
    101
    102    /**
    103     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
    104     * that will throw a {@link org.apache.commons.beanutils.ConversionException}
    105     * if a conversion error occurs. An unlocalized pattern is used for the convertion.
    106     *
    107     * @param locale        The locale
    108     * @param pattern       The convertion pattern
    109     */
    110    public DecimalLocaleConverter(final Locale locale, final String pattern) {
    111
    112        this(locale, pattern, false);
    113    }
    114
    115    /**
    116     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
    117     * that will throw a {@link org.apache.commons.beanutils.ConversionException}
    118     * if a conversion error occurs.
    119     *
    120     * @param locale        The locale
    121     * @param pattern       The convertion pattern
    122     * @param locPattern    Indicate whether the pattern is localized or not
    123     */
    124    public DecimalLocaleConverter(final Locale locale, final String pattern, final boolean locPattern) {
    125
    126        super(locale, pattern, locPattern);
    127    }
    128
    129    /**
    130     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
    131     * that will return the specified default value
    132     * if a conversion error occurs. The locale is the default locale for
    133     * this instance of the Java Virtual Machine and an unlocalized pattern is used
    134     * for the convertion.
    135     *
    136     * @param defaultValue  The default value to be returned
    137     */
    138    public DecimalLocaleConverter(final Object defaultValue) {
    139
    140        this(defaultValue, false);
    141    }
    142
    143    /**
    144     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
    145     * that will return the specified default value
    146     * if a conversion error occurs. The locale is the default locale for
    147     * this instance of the Java Virtual Machine.
    148     *
    149     * @param defaultValue  The default value to be returned
    150     * @param locPattern    Indicate whether the pattern is localized or not
    151     */
    152    public DecimalLocaleConverter(final Object defaultValue, final boolean locPattern) {
    153
    154        this(defaultValue, Locale.getDefault(), locPattern);
    155    }
    156
    157    /**
    158     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
    159     * that will return the specified default value
    160     * if a conversion error occurs. An unlocalized pattern is used for the convertion.
    161     *
    162     * @param defaultValue  The default value to be returned
    163     * @param locale        The locale
    164     */
    165    public DecimalLocaleConverter(final Object defaultValue, final Locale locale) {
    166
    167        this(defaultValue, locale, false);
    168    }
    169
    170    /**
    171     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
    172     * that will return the specified default value
    173     * if a conversion error occurs.
    174     *
    175     * @param defaultValue  The default value to be returned
    176     * @param locale        The locale
    177     * @param locPattern    Indicate whether the pattern is localized or not
    178     */
    179    public DecimalLocaleConverter(final Object defaultValue, final Locale locale, final boolean locPattern) {
    180
    181        this(defaultValue, locale, null, locPattern);
    182    }
    183
    184    /**
    185     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
    186     * that will return the specified default value
    187     * if a conversion error occurs. An unlocalized pattern is used for the convertion.
    188     *
    189     * @param defaultValue  The default value to be returned
    190     * @param locale        The locale
    191     * @param pattern       The convertion pattern
    192     */
    193    public DecimalLocaleConverter(final Object defaultValue, final Locale locale, final String pattern) {
    194
    195        this(defaultValue, locale, pattern, false);
    196    }
    197
    198    /**
    199     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
    200     * that will return the specified default value
    201     * if a conversion error occurs.
    202     *
    203     * @param defaultValue  The default value to be returned
    204     * @param locale        The locale
    205     * @param pattern       The convertion pattern
    206     * @param locPattern    Indicate whether the pattern is localized or not
    207     */
    208    public DecimalLocaleConverter(final Object defaultValue, final Locale locale, final String pattern, final boolean locPattern) {
    209
    210        super(defaultValue, locale, pattern, locPattern);
    211
    212    }
    213
    214    // --------------------------------------------------------- Methods
    215
    216    /**
    217     * Convert the specified locale-sensitive input object into an output
    218     * object of the specified type.
    219     *
    220     * @param value The input object to be converted
    221     * @param pattern The pattern is used for the convertion
    222     * @return The converted value
    223     *
    224     * @throws org.apache.commons.beanutils.ConversionException if conversion
    225     * cannot be performed successfully
    226     * @throws ParseException if an error occurs parsing a String to a Number
    227     */
    228    @Override
    229    protected Object parse(final Object value, final String pattern) throws ParseException {
    230
    231        if (value instanceof Number) {
    232            return value;
    233        }
    234
    235        // Note that despite the ambiguous "getInstance" name, and despite the
    236        // fact that objects returned from this method have the same toString
    237        // representation, each call to getInstance actually returns a new
    238        // object.
    239        final DecimalFormat formatter = (DecimalFormat) DecimalFormat.getInstance(locale);
    240
    241        // if some constructors default pattern to null, it makes only sense
    242        // to handle null pattern gracefully
    243        if (pattern != null) {
    244            if (locPattern) {
    245                formatter.applyLocalizedPattern(pattern);
    246            } else {
    247                formatter.applyPattern(pattern);
    248            }
    249        } else {
    250            log.debug("No pattern provided, using default.");
    251        }
    252
    253        return formatter.parse((String) value);
    254    }
    255}