001/*
002 * Copyright 2002-2017 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *      https://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017package org.springframework.format.number;
018
019import java.text.DecimalFormat;
020import java.text.NumberFormat;
021import java.util.Locale;
022
023/**
024 * A general-purpose number formatter using NumberFormat's number style.
025 *
026 * <p>Delegates to {@link java.text.NumberFormat#getInstance(Locale)}.
027 * Configures BigDecimal parsing so there is no loss in precision.
028 * Allows configuration over the decimal number pattern.
029 * The {@link #parse(String, Locale)} routine always returns a BigDecimal.
030 *
031 * @author Keith Donald
032 * @author Juergen Hoeller
033 * @since 4.2
034 * @see #setPattern
035 * @see #setLenient
036 */
037public class NumberStyleFormatter extends AbstractNumberFormatter {
038
039        private String pattern;
040
041
042        /**
043         * Create a new NumberStyleFormatter without a pattern.
044         */
045        public NumberStyleFormatter() {
046        }
047
048        /**
049         * Create a new NumberStyleFormatter with the specified pattern.
050         * @param pattern the format pattern
051         * @see #setPattern
052         */
053        public NumberStyleFormatter(String pattern) {
054                this.pattern = pattern;
055        }
056
057
058        /**
059         * Specify the pattern to use to format number values.
060         * If not specified, the default DecimalFormat pattern is used.
061         * @see java.text.DecimalFormat#applyPattern(String)
062         */
063        public void setPattern(String pattern) {
064                this.pattern = pattern;
065        }
066
067
068        @Override
069        public NumberFormat getNumberFormat(Locale locale) {
070                NumberFormat format = NumberFormat.getInstance(locale);
071                if (!(format instanceof DecimalFormat)) {
072                        if (this.pattern != null) {
073                                throw new IllegalStateException("Cannot support pattern for non-DecimalFormat: " + format);
074                        }
075                        return format;
076                }
077                DecimalFormat decimalFormat = (DecimalFormat) format;
078                decimalFormat.setParseBigDecimal(true);
079                if (this.pattern != null) {
080                        decimalFormat.applyPattern(this.pattern);
081                }
082                return decimalFormat;
083        }
084
085}