average BigDecimal - Java java.math

Java examples for java.math:BigDecimal Calculation

Description

average BigDecimal

Demo Code

/*// w  w w . j a va  2s.  c om
 * Copyright (c) 2005-2009, Topicus b.v.
 * All rights reserved
 */
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.List;

public class Main{
    /**
     * @param bigDecimalList
     * @return het gemiddelde als er cijfers in de bigDecimalList zitten, anders -1
     */
    public static final BigDecimal average(List<BigDecimal> bigDecimalList) {
        if (bigDecimalList == null) {
            return BigDecimal.valueOf(-1);
        }

        BigDecimal sum = BigDecimal.valueOf(0);
        int aantalCijfers = 0;
        for (BigDecimal bigDecimal : bigDecimalList) {
            if (bigDecimal != null) {
                sum = sum.add(bigDecimal);
                aantalCijfers++;

            }
        }
        // Bij geen cijfers -1 terug geven
        if (aantalCijfers == 0)
            return BigDecimal.valueOf(-1);

        // return sum.divide(BigDecimal.valueOf(aantalCijfers), 2);
        return divide(sum, new MathContext(2, RoundingMode.HALF_UP),
                aantalCijfers);
    }
    /**
     * Maakt een BigDecimal van de gegeven string.
     * 
     * @param string
     * @return BigDecimal representatie van de gegeven string.
     */
    public static final BigDecimal valueOf(String string) {
        return new BigDecimal(localizeString(string));
    }
    /**
     * @param decimal
     * @param by
     * @return decimal / by
     */
    public static final BigDecimal divide(BigDecimal decimal, int by) {
        return decimal.divide(BigDecimal.valueOf(by));
    }
    /**
     * @param decimal
     * @param mc
     * @param by
     * @return decimal / by afgerond volgens de context
     */
    public static final BigDecimal divide(BigDecimal decimal,
            MathContext mc, int by) {
        return decimal.divide(BigDecimal.valueOf(by), mc);
    }
    /**
     * @param decimal
     * @param mc
     * @param by
     * @return decimal / by afgerond volgens de context
     */
    public static final BigDecimal divide(BigDecimal decimal,
            MathContext mc, BigDecimal by) {
        return decimal.divide(by, mc);
    }
    /**
     * @param decimal
     * @param by
     * @return decimal / by
     */
    public static final BigDecimal divide(int decimal, int by) {
        return BigDecimal.valueOf(decimal).divide(BigDecimal.valueOf(by));
    }
    /**
     * @param decimal
     * @param mc
     * @param by
     * @return decimal / by afgerond volgens de context
     */
    public static final BigDecimal divide(int decimal, MathContext mc,
            int by) {
        return BigDecimal.valueOf(decimal).divide(BigDecimal.valueOf(by),
                mc);
    }
    private static final String localizeString(String org) {
        int punten = StringUtil.countOccurances(org, '.');
        int comma = StringUtil.countOccurances(org, ',');
        if (punten == 1 && comma == 0)
            return org;
        else if (comma == 1 && punten == 0)
            return org.replace(',', '.');
        else if (punten > 1 && comma > 1)
            throw new IllegalArgumentException(
                    "Ongeldig aantal punten en comma's");

        int puntIndex = punten > 0 ? org.indexOf('.') : -1;
        int commaIndex = comma > 0 ? org.indexOf(',') : -1;
        if (before(puntIndex, commaIndex)) {
            if (comma > punten)
                throw new IllegalArgumentException(
                        "Er zijn meer comma's dan punten maar de punt komt eerst");
            String[] tokens = org.split("\\.", -1);
            return handleParts(org, tokens, ',', true);
        } else if (before(commaIndex, puntIndex)) {
            if (punten > comma)
                throw new IllegalArgumentException(
                        "Er zijn meer punten dan comma's maar de comma komt eerst");
            String[] tokens = org.split(",", -1);
            return handleParts(org, tokens, '.', false);
        } else
            // geen punten of comma's
            return org;
    }
    private static final boolean before(int index1, int index2) {
        return (index2 == -1 && index1 >= 0)
                || (index1 >= 0 && index1 < index2);
    }
    /**
     * @param org
     * @param tokens
     * @return
     */
    private static final String handleParts(String org, String[] tokens,
            char decimalSeparator, boolean replaceDot) {
        String result = validateString(tokens, decimalSeparator);
        if (result != null)
            throw new IllegalArgumentException("\"" + result
                    + "\" is geen geldig duizendtal.");
        if (replaceDot)
            tokens[tokens.length - 1] = tokens[tokens.length - 1].replace(
                    ',', '.');
        StringBuilder builder = new StringBuilder(org.length());
        for (int i = 0; i < tokens.length; i++) {
            builder.append(tokens[i]);
        }
        return builder.toString();
    }
}

Related Tutorials