content: /*
   * CSVeed (https://github.com/42BV/CSVeed)
   *
   * Copyright 2013-2023 CSVeed.
   *
   * All rights reserved. This program and the accompanying materials
   * are made available under the terms of The Apache Software License,
   * Version 2.0 which accompanies this distribution, and is available at
   * https://www.apache.org/licenses/LICENSE-2.0.txt
   */
  package org.csveed.bean.conversion;
  
  import static org.csveed.bean.conversion.ConversionUtil.hasText;
  
  import java.text.NumberFormat;
  
  /**
   * The Class CustomNumberConverter.
   */
  public class CustomNumberConverter extends AbstractConverter<Number> {
  
      /** The number class. */
      private final Class<? extends Number> numberClass;
  
      /** The number format. */
      private final NumberFormat numberFormat;
  
      /** The allow empty. */
      private final boolean allowEmpty;
  
      /**
       * Instantiates a new custom number converter.
       *
       * @param numberClass
       *            the number class
       * @param allowEmpty
       *            the allow empty
       *
       * @throws IllegalArgumentException
       *             the illegal argument exception
       */
      public CustomNumberConverter(Class<? extends Number> numberClass, boolean allowEmpty)
              throws IllegalArgumentException {
          this(numberClass, null, allowEmpty);
      }
  
      /**
       * Instantiates a new custom number converter.
       *
       * @param numberClass
       *            the number class
       * @param numberFormat
       *            the number format
       * @param allowEmpty
       *            the allow empty
       *
       * @throws IllegalArgumentException
       *             the illegal argument exception
       */
      public CustomNumberConverter(Class<? extends Number> numberClass, NumberFormat numberFormat, boolean allowEmpty)
              throws IllegalArgumentException {
          super(Number.class);
  
          if (numberClass == null || !Number.class.isAssignableFrom(numberClass)) {
              throw new IllegalArgumentException("Property class must be a subclass of Number");
          }
          this.numberClass = numberClass;
          this.numberFormat = numberFormat;
          this.allowEmpty = allowEmpty;
      }
  
      @Override
      public Number fromString(String text) throws Exception {
          if (this.allowEmpty && !hasText(text)) {
              return null;
          }
          if (this.numberFormat != null) {
              return determineValue(NumberUtils.parseNumber(text, this.numberClass, this.numberFormat));
          }
          return determineValue(NumberUtils.parseNumber(text, this.numberClass));
      }
  
      /**
       * Determine value.
       *
       * @param value
       *            the value
       *
       * @return the number
       */
      public Number determineValue(Object value) {
          if (value instanceof Number) {
              return NumberUtils.convertNumberToTargetClass((Number) value, this.numberClass);
          }
          return null;
      }
  
      @Override
      public String toString(Number value) throws Exception {
          if (value == null) {
              return "";
          }
          if (this.numberFormat != null) {
              return this.numberFormat.format(value);
          }
          return value.toString();
      }
  
  }
  