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    
018    package org.apache.commons.beanutils.locale.converters;
019    
020    import org.apache.commons.beanutils.locale.BaseLocaleConverter;
021    import org.apache.commons.logging.Log;
022    import org.apache.commons.logging.LogFactory;
023    
024    import java.text.DecimalFormat;
025    import java.text.ParseException;
026    import 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     * @author Yauheny Mikulski
038     * @author Yoav Shapira
039     * @since 1.7
040     */
041    
042    public class DecimalLocaleConverter extends BaseLocaleConverter {
043    
044    
045        // ----------------------------------------------------- Instance Variables
046    
047        /** All logging goes through this logger */
048        private Log log = LogFactory.getLog(DecimalLocaleConverter.class);     
049    
050        // ----------------------------------------------------------- Constructors
051    
052        /**
053         * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter} 
054         * that will throw a {@link org.apache.commons.beanutils.ConversionException}
055         * if a conversion error occurs. The locale is the default locale for
056         * this instance of the Java Virtual Machine and an unlocalized pattern is used
057         * for the convertion.
058         *
059         */
060        public DecimalLocaleConverter() {
061    
062            this(false);
063        }
064    
065        /**
066         * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter} 
067         * that will throw a {@link org.apache.commons.beanutils.ConversionException}
068         * if a conversion error occurs. The locale is the default locale for
069         * this instance of the Java Virtual Machine.
070         *
071         * @param locPattern    Indicate whether the pattern is localized or not
072         */
073        public DecimalLocaleConverter(boolean locPattern) {
074    
075            this(Locale.getDefault(), locPattern);
076        }
077    
078        /**
079         * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter} 
080         * that will throw a {@link org.apache.commons.beanutils.ConversionException}
081         * if a conversion error occurs. An unlocalized pattern is used for the convertion.
082         *
083         * @param locale        The locale
084         */
085        public DecimalLocaleConverter(Locale locale) {
086    
087            this(locale, false);
088        }
089    
090        /**
091         * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter} 
092         * that will throw a {@link org.apache.commons.beanutils.ConversionException}
093         * if a conversion error occurs.
094         *
095         * @param locale        The locale
096         * @param locPattern    Indicate whether the pattern is localized or not
097         */
098        public DecimalLocaleConverter(Locale locale, boolean locPattern) {
099    
100            this(locale, (String) null, locPattern);
101        }
102    
103        /**
104         * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter} 
105         * that will throw a {@link org.apache.commons.beanutils.ConversionException}
106         * if a conversion error occurs. An unlocalized pattern is used for the convertion.
107         *
108         * @param locale        The locale
109         * @param pattern       The convertion pattern
110         */
111        public DecimalLocaleConverter(Locale locale, String pattern) {
112    
113            this(locale, pattern, false);
114        }
115    
116        /**
117         * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter} 
118         * that will throw a {@link org.apache.commons.beanutils.ConversionException}
119         * if a conversion error occurs.
120         *
121         * @param locale        The locale
122         * @param pattern       The convertion pattern
123         * @param locPattern    Indicate whether the pattern is localized or not
124         */
125        public DecimalLocaleConverter(Locale locale, String pattern, boolean locPattern) {
126    
127            super(locale, pattern, locPattern);
128        }
129    
130        /**
131         * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter} 
132         * that will return the specified default value
133         * if a conversion error occurs. The locale is the default locale for
134         * this instance of the Java Virtual Machine and an unlocalized pattern is used
135         * for the convertion.
136         *
137         * @param defaultValue  The default value to be returned
138         */
139        public DecimalLocaleConverter(Object defaultValue) {
140    
141            this(defaultValue, false);
142        }
143    
144        /**
145         * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter} 
146         * that will return the specified default value
147         * if a conversion error occurs. The locale is the default locale for
148         * this instance of the Java Virtual Machine.
149         *
150         * @param defaultValue  The default value to be returned
151         * @param locPattern    Indicate whether the pattern is localized or not
152         */
153        public DecimalLocaleConverter(Object defaultValue, boolean locPattern) {
154    
155            this(defaultValue, Locale.getDefault(), locPattern);
156        }
157    
158        /**
159         * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter} 
160         * that will return the specified default value
161         * if a conversion error occurs. An unlocalized pattern is used for the convertion.
162         *
163         * @param defaultValue  The default value to be returned
164         * @param locale        The locale
165         */
166        public DecimalLocaleConverter(Object defaultValue, Locale locale) {
167    
168            this(defaultValue, locale, false);
169        }
170    
171        /**
172         * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter} 
173         * that will return the specified default value
174         * if a conversion error occurs.
175         *
176         * @param defaultValue  The default value to be returned
177         * @param locale        The locale
178         * @param locPattern    Indicate whether the pattern is localized or not
179         */
180        public DecimalLocaleConverter(Object defaultValue, Locale locale, boolean locPattern) {
181    
182            this(defaultValue, locale, null, locPattern);
183        }
184    
185        /**
186         * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter} 
187         * that will return the specified default value
188         * if a conversion error occurs. An unlocalized pattern is used for the convertion.
189         *
190         * @param defaultValue  The default value to be returned
191         * @param locale        The locale
192         * @param pattern       The convertion pattern
193         */
194        public DecimalLocaleConverter(Object defaultValue, Locale locale, String pattern) {
195    
196            this(defaultValue, locale, pattern, false);
197        }
198    
199        /**
200         * Create a {@link org.apache.commons.beanutils.locale.LocaleConverter} 
201         * that will return the specified default value
202         * if a conversion error occurs.
203         *
204         * @param defaultValue  The default value to be returned
205         * @param locale        The locale
206         * @param pattern       The convertion pattern
207         * @param locPattern    Indicate whether the pattern is localized or not
208         */
209        public DecimalLocaleConverter(Object defaultValue, Locale locale, String pattern, boolean locPattern) {
210    
211            super(defaultValue, locale, pattern, locPattern);
212    
213        }
214    
215        // --------------------------------------------------------- Methods
216    
217        /**
218         * Convert the specified locale-sensitive input object into an output 
219         * object of the specified type.
220         *
221         * @param value The input object to be converted
222         * @param pattern The pattern is used for the convertion
223         * @return The converted value
224         *
225         * @exception org.apache.commons.beanutils.ConversionException if conversion
226         * cannot be performed successfully
227         * @throws ParseException if an error occurs parsing a String to a Number
228         */
229        protected Object parse(Object value, 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            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    }