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.ConversionException;
021
022import java.util.Locale;
023import java.text.ParseException;
024
025
026/**
027 * <p>Standard {@link org.apache.commons.beanutils.locale.LocaleConverter}
028 * implementation that converts an incoming
029 * locale-sensitive String into a <code>java.math.BigDecimal</code> object,
030 * optionally using a default value or throwing a
031 * {@link org.apache.commons.beanutils.ConversionException}
032 * if a conversion error occurs.</p>
033 *
034 * @version $Id$
035 */
036
037public class FloatLocaleConverter extends DecimalLocaleConverter {
038
039
040    // ----------------------------------------------------------- Constructors
041
042    /**
043     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
044     * that will throw a {@link org.apache.commons.beanutils.ConversionException}
045     * if a conversion error occurs. The locale is the default locale for
046     * this instance of the Java Virtual Machine and an unlocalized pattern is used
047     * for the convertion.
048     *
049     */
050    public FloatLocaleConverter() {
051
052        this(false);
053    }
054
055    /**
056     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
057     * that will throw a {@link org.apache.commons.beanutils.ConversionException}
058     * if a conversion error occurs. The locale is the default locale for
059     * this instance of the Java Virtual Machine.
060     *
061     * @param locPattern    Indicate whether the pattern is localized or not
062     */
063    public FloatLocaleConverter(final boolean locPattern) {
064
065        this(Locale.getDefault(), locPattern);
066    }
067
068    /**
069     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
070     * that will throw a {@link org.apache.commons.beanutils.ConversionException}
071     * if a conversion error occurs. An unlocalized pattern is used for the convertion.
072     *
073     * @param locale        The locale
074     */
075    public FloatLocaleConverter(final Locale locale) {
076
077        this(locale, false);
078    }
079
080    /**
081     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
082     * that will throw a {@link org.apache.commons.beanutils.ConversionException}
083     * if a conversion error occurs.
084     *
085     * @param locale        The locale
086     * @param locPattern    Indicate whether the pattern is localized or not
087     */
088    public FloatLocaleConverter(final Locale locale, final boolean locPattern) {
089
090        this(locale, (String) null, locPattern);
091    }
092
093    /**
094     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
095     * that will throw a {@link org.apache.commons.beanutils.ConversionException}
096     * if a conversion error occurs. An unlocalized pattern is used for the convertion.
097     *
098     * @param locale        The locale
099     * @param pattern       The convertion pattern
100     */
101    public FloatLocaleConverter(final Locale locale, final String pattern) {
102
103        this(locale, pattern, false);
104    }
105
106    /**
107     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
108     * that will throw a {@link org.apache.commons.beanutils.ConversionException}
109     * if a conversion error occurs.
110     *
111     * @param locale        The locale
112     * @param pattern       The convertion pattern
113     * @param locPattern    Indicate whether the pattern is localized or not
114     */
115    public FloatLocaleConverter(final Locale locale, final String pattern, final boolean locPattern) {
116
117        super(locale, pattern, locPattern);
118    }
119
120    /**
121     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
122     * that will return the specified default value
123     * if a conversion error occurs. The locale is the default locale for
124     * this instance of the Java Virtual Machine and an unlocalized pattern is used
125     * for the convertion.
126     *
127     * @param defaultValue  The default value to be returned
128     */
129    public FloatLocaleConverter(final Object defaultValue) {
130
131        this(defaultValue, false);
132    }
133
134    /**
135     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
136     * that will return the specified default value
137     * if a conversion error occurs. The locale is the default locale for
138     * this instance of the Java Virtual Machine.
139     *
140     * @param defaultValue  The default value to be returned
141     * @param locPattern    Indicate whether the pattern is localized or not
142     */
143    public FloatLocaleConverter(final Object defaultValue, final boolean locPattern) {
144
145        this(defaultValue, Locale.getDefault(), locPattern);
146    }
147
148    /**
149     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
150     * that will return the specified default value
151     * if a conversion error occurs. An unlocalized pattern is used for the convertion.
152     *
153     * @param defaultValue  The default value to be returned
154     * @param locale        The locale
155     */
156    public FloatLocaleConverter(final Object defaultValue, final Locale locale) {
157
158        this(defaultValue, locale, false);
159    }
160
161    /**
162     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
163     * that will return the specified default value
164     * if a conversion error occurs.
165     *
166     * @param defaultValue  The default value to be returned
167     * @param locale        The locale
168     * @param locPattern    Indicate whether the pattern is localized or not
169     */
170    public FloatLocaleConverter(final Object defaultValue, final Locale locale, final boolean locPattern) {
171
172        this(defaultValue, locale, null, locPattern);
173    }
174
175    /**
176     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
177     * that will return the specified default value
178     * if a conversion error occurs. An unlocalized pattern is used for the convertion.
179     *
180     * @param defaultValue  The default value to be returned
181     * @param locale        The locale
182     * @param pattern       The convertion pattern
183     */
184    public FloatLocaleConverter(final Object defaultValue, final Locale locale, final String pattern) {
185
186        this(defaultValue, locale, pattern, false);
187    }
188
189    /**
190     * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter}
191     * that will return the specified default value
192     * if a conversion error occurs.
193     *
194     * @param defaultValue  The default value to be returned
195     * @param locale        The locale
196     * @param pattern       The convertion pattern
197     * @param locPattern    Indicate whether the pattern is localized or not
198     */
199    public FloatLocaleConverter(final Object defaultValue, final Locale locale, final String pattern, final boolean locPattern) {
200
201        super(defaultValue, locale, pattern, locPattern);
202    }
203
204   /**
205    * Convert the specified locale-sensitive input object into an output object of the
206    * specified type.  This method will return Float value or throw exception if value
207    * can not be stored in the Float.
208    *
209    * @param value The input object to be converted
210    * @param pattern The pattern is used for the convertion
211    * @return The converted value
212    *
213    * @throws ConversionException if conversion cannot be performed
214    *  successfully
215    * @throws ParseException if an error occurs parsing a String to a Number
216    */
217   @Override
218protected Object parse(final Object value, final String pattern) throws ParseException {
219      final Number parsed = (Number) super.parse(value, pattern);
220      final double doubleValue = parsed.doubleValue();
221      final double posDouble = (doubleValue >= 0) ? doubleValue : (doubleValue * -1);
222      if (posDouble != 0 && (posDouble < Float.MIN_VALUE || posDouble > Float.MAX_VALUE)) {
223          throw new ConversionException("Supplied number is not of type Float: "+parsed);
224      }
225      return new Float(parsed.floatValue()); // unlike superclass it returns Float type
226   }
227}