    001    // Copyright 2009 The Apache Software Foundation
    002    //
    003    // Licensed under the Apache License, Version 2.0 (the "License");
    004    // you may not use this file except in compliance with the License.
    005    // You may obtain a copy of the License at
    006    //
    007    //     http://www.apache.org/licenses/LICENSE-2.0
    008    //
    009    // Unless required by applicable law or agreed to in writing, software
    010    // distributed under the License is distributed on an "AS IS" BASIS,
    011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    012    // See the License for the specific language governing permissions and
    013    // limitations under the License.
    014
    015    package org.apache.tapestry5.internal.translator;
    016
    017    import java.text.DecimalFormatSymbols;
    018    import java.text.ParseException;
    019
    020    /**
    021     * Base class for parsing/formatting BigInteger and BigDecimal.
    022     *
    023     * @since 5.1.0.1
    024     */
    025    public abstract class BigTypesFormatter implements NumericFormatter
    026    {
    027        protected final DecimalFormatSymbols symbols;
    028
    029        public BigTypesFormatter(DecimalFormatSymbols symbols)
    030        {
    031            this.symbols = symbols;
    032        }
    033
    034        protected String toString(char ch)
    035        {
    036            return String.valueOf(ch);
    037        }
    038
    039        public String toClient(Number value)
    040        {
    041            String normal = value.toString();
    042
    043            // When formatting integers, we don't use the grouping seperator.
    044
    045            return normal.replace('-', symbols.getMinusSign()).replace('.', symbols.getDecimalSeparator());
    046        }
    047
    048        public Number parse(String clientValue) throws ParseException
    049        {
    050                    // Allow for " " here since FF2/IE replaces \u00A0 (non breaking space) with \u0020 (normal space)
    051            String noGroups = clientValue.replace(toString(symbols.getGroupingSeparator()), "").replace(" ", "");
    052            String fixedNeg = noGroups.replace(symbols.getMinusSign(), '-');
    053            String fixedDec = fixedNeg.replace(symbols.getDecimalSeparator(), '.');
    054
    055            try
    056            {
    057                return parseConvertedValue(fixedDec);
    058            }
    059            catch (NumberFormatException ex)
    060            {
    061                throw new ParseException(ex.getMessage(), 0);
    062            }
    063        }
    064
    065        protected abstract Number parseConvertedValue(String converted);
    066    }