content: /*
   * Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to You under the Apache License, Version 2.0
   * (the "License"); you may not use this file except in compliance with
   * the License.  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package org.apache.camel.dataformat.bindy.format;
  
  import java.text.DecimalFormat;
  import java.text.DecimalFormatSymbols;
  import java.text.NumberFormat;
  import java.util.Locale;
  
  import org.apache.camel.dataformat.bindy.PatternFormat;
  
  public abstract class NumberPatternFormat<T> implements PatternFormat<T> {
  
      private String pattern;
      private Locale locale;
      private String decimalSeparator;
      private String groupingSeparator;
      private int precision;
      private String rounding;
  
      protected NumberPatternFormat() {
      }
  
      protected NumberPatternFormat(String pattern, Locale locale) {
          this.pattern = pattern;
          this.locale = locale;
      }
  
      protected NumberPatternFormat(String pattern, Locale locale, int precision, String rounding, String decimalSeparator,
                                    String groupingSeparator) {
          this.pattern = pattern;
          this.locale = locale;
          this.decimalSeparator = decimalSeparator;
          this.groupingSeparator = groupingSeparator;
          this.precision = precision;
          this.rounding = rounding;
      }
  
      @Override
      public String format(T object) throws Exception {
          if (getNumberFormat() != null) {
              return this.getNumberFormat().format(object);
          } else {
              return object.toString();
          }
      }
  
      @Override
      public abstract T parse(String string) throws Exception;
  
      /**
       * Gets the number format if in use.
       *
       * @return the number format, or <tt>null</tt> if not in use
       */
      protected NumberFormat getNumberFormat() {
          if (locale == null) {
              return null;
          }
  
          NumberFormat format = NumberFormat.getNumberInstance(locale);
          if (format instanceof DecimalFormat) {
              DecimalFormat df = (DecimalFormat) format;
              if (decimalSeparator != null && groupingSeparator != null) {
                  if (!decimalSeparator.isEmpty() && !groupingSeparator.isEmpty()) {
                      DecimalFormatSymbols dfs = new DecimalFormatSymbols(locale);
                      dfs.setDecimalSeparator(decimalSeparator.charAt(0));
                      dfs.setGroupingSeparator(groupingSeparator.charAt(0));
                      df.setDecimalFormatSymbols(dfs);
                  }
              }
              if (!pattern.isEmpty()) {
                  df.applyPattern(pattern);
              }
          }
          return format;
      }
  
      @Override
      public String getPattern() {
          return pattern;
      }
  
      public void setPattern(String pattern) {
          this.pattern = pattern;
      }
  
      public int getPrecision() {
          return precision;
      }
  
      public void setPrecision(int precision) {
          this.precision = precision;
      }
  
      public String getRounding() {
          return rounding;
      }
  
      public void setRounding(String rounding) {
          this.rounding = rounding;
      }
  
      public Locale getLocale() {
          return locale;
      }
  
      public void setLocale(Locale locale) {
          this.locale = locale;
      }
  
  }
  