Open Source Repository

Home /csv/supercsv-1.52 | Repository Home



org/supercsv/cellprocessor/ParseBigDecimal.java
package org.supercsv.cellprocessor;

import java.math.BigDecimal;
import java.text.DecimalFormatSymbols;

import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.cellprocessor.ift.StringCellProcessor;
import org.supercsv.exception.NullInputException;
import org.supercsv.exception.SuperCSVException;
import org.supercsv.util.CSVContext;

/**
 * Convert a string to a big decimal. It constructs BigDecimals from strings as recommended by the Javadoc (e.g.
 <tt>new BigDecimal(0.1)</tt> yields unpredictable results, while <tt>new BidDecimal("0.1")</tt> yields
 * predictable results.
 
 @since 1.30
 @author Kasper B. Graversen
 */
public class ParseBigDecimal extends CellProcessorAdaptor implements StringCellProcessor {

private DecimalFormatSymbols symbols;

public ParseBigDecimal() {
    this((DecimalFormatSymbols)null);
}

public ParseBigDecimal(DecimalFormatSymbols symbols) {
    super();
    this.symbols = symbols;
}

public ParseBigDecimal(final CellProcessor next) {
    this(null,next);
}

public ParseBigDecimal(DecimalFormatSymbols symbols, final CellProcessor next) {
    super(next);
    this.symbols = symbols;
}

/**
 * {@inheritDoc}
 */
@Override
public Object execute(final Object value, final CSVContext contextthrows SuperCSVException {
  ifvalue == null ) { throw new NullInputException("Input cannot be null on line " + context.lineNumber + " at column " + context.columnNumber, context, this)}
  final BigDecimal result;
  ifvalue instanceof String ) {
    try {
            if (symbols == null) {
                result = new BigDecimal((Stringvalue);
            else {
                if (symbols.getDecimalSeparator() != '.') {
                    String s = (Stringvalue;
                    result = new BigDecimal(s.replace(symbols.getDecimalSeparator()'.'));
                else {
                    result = new BigDecimal((Stringvalue);
                }
            }
        }
    catch(final Exception e) {
      throw new SuperCSVException("Parser error", context, this, e);
    }
  else {
    throw new SuperCSVException("Can't convert \"" + value
      "\" to a BigDecimal. Input is not of type String, but of type " + value.getClass().getName(), context,
      this);
  }
  
  return next.execute(result, context);
}
}