All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.tsl2.nano.util.operation.NumericOperator Maven / Gradle / Ivy

/*
 * File: $HeadURL$
 * Id  : $Id$
 * 
 * created by: Tom
 * created on: 22.10.2013
 * 
 * Copyright: (c) Thomas Schneider 2013, all rights reserved
 */
package de.tsl2.nano.util.operation;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.HashMap;
import java.util.Map;

import de.tsl2.nano.action.CommonAction;
import de.tsl2.nano.action.IAction;

/**
 * Numeric Operator as a sample implementation of {@link Operator}. Is able to do math operations on decimals (including
 * currency symbols). Override {@link #createOperations()} to have more operation definitions.
 * 
 * @author Tom
 * @version $Revision$
 */
public class NumericOperator extends SOperator {
    
    /**
     * constructor
     */
    public NumericOperator() {
        this(null);
    }

    /**
     * constructor
     * @param values
     */
    public NumericOperator(
            Map values) {
        super(CharSequence.class, createConverter(), values);
    }

    protected static IConverter createConverter() {
        DecimalFormat fmt = (DecimalFormat) NumberFormat.getInstance();
        fmt.setParseBigDecimal(true);
        return new FromCharSequenceConverter(fmt);
    }
    
    /**
     * define all possible operations. see {@link #operationDefs}
     */
    @Override
    @SuppressWarnings("serial")
    protected void createOperations() {
        syntax.put(KEY_OPERATION, "[-+*/%^]");
        syntax.put(KEY_HIGH_OPERATION, "[*/%^]");
//        syntax.put(KEY_DEFAULT_OPERAND, "0");
//        syntax.put(KEY_DEFAULT_OPERATOR, "+");
        operationDefs = new HashMap>();
        addOperation("+", new CommonAction() {
            @Override
            public BigDecimal action() throws Exception {
                return ((BigDecimal) parameters().getValue(0)).add(((BigDecimal) parameters().getValue(1)));
            }
        });
        addOperation("-", new CommonAction() {
            @Override
            public BigDecimal action() throws Exception {
                return ((BigDecimal) parameters().getValue(0)).subtract(((BigDecimal) parameters().getValue(1)));
            }
        });
        addOperation("*", new CommonAction() {
            @Override
            public BigDecimal action() throws Exception {
                return ((BigDecimal) parameters().getValue(0)).multiply(((BigDecimal) parameters().getValue(1)));
            }
        });
        addOperation("/", new CommonAction() {
            @Override
            public BigDecimal action() throws Exception {
                return ((BigDecimal) parameters().getValue(0)).divide(((BigDecimal) parameters().getValue(1)));
            }
        });
        addOperation("%", new CommonAction() {
            @Override
            public BigDecimal action() throws Exception {
                return new BigDecimal(((BigDecimal)parameters().getValue(0)).intValueExact() % ((BigDecimal)parameters().getValue(1)).intValueExact());
            }
        });
        addOperation("^", new CommonAction() {
            @Override
            public BigDecimal action() throws Exception {
                return ((BigDecimal) parameters().getValue(0)).pow(((BigDecimal)parameters().getValue(1)).intValueExact());
            }
        });
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy