package javacodebook.core.numbertools;

/**
 *
 * @author Mark Donnermeyer
 */
public class NumberToolbox {
    
    private static final double DOUBLE_DELTA = 0.000000000000001d;
    private static final float  FLOAT_DELTA  = 0.000001f;
    
    /**
     * Verwandelt einen String in eine Int-Zahl.
     */
    public static int parseInt(String str, int defaultVal) {
        try {
            return Integer.parseInt(str);
        }
        catch (Exception e) {
            return defaultVal;
        }
    }

    /**
     * Verwandelt ein beliebiges Objekt in eine Int-Zahl
     */
    public static int parseInt(Object obj, int defaultVal) {
        if (obj == null)
            return defaultVal;
        else if (obj instanceof Number)
            return ((Number)obj).intValue();
        else
            return parseInt(obj.toString(), defaultVal);
    }
    

    /**
     * Vergleicht zwei Float-Zahlen mit einer geringen Toleranz
     * Wenn |f1-f2| < delta gilt, wird f1 == f2 angenommen
     */
    public static int cmpFloat(float f1, float f2) {
        return cmpFloat(f1, f2, FLOAT_DELTA);
    }
    
    /**
     * Vergleicht zwei Float-Zahlen mit einer geringen Toleranz. 
     * Wenn |f1-f2| < delta gilt, wird f1 == f2 angenommen
     */
    public static int cmpFloat(float f1, float f2, float delta) {
        if (Math.abs(f1-f2) < delta)
            return 0;
        else if (f1 > f2)
            return 1;
        else
            return -1;
    }
    
    /**
     * Vergleicht zwei Double-Zahlen mit einer geringen Toleranz
     * Wenn |d1-d2| < delta gilt, wird d1 == d2 angenommen
     */
    public static int cmpDouble(double d1, double d2) {
        return cmpDouble(d1, d2, DOUBLE_DELTA);
    }
    
    /**
     * Vergleicht zwei Double-Zahlen mit einer geringen Toleranz
     * Wenn |d1-d2| < delta gilt, wird d1 == d2 angenommen
     */
    public static int cmpDouble(double d1, double d2, double delta) {
        if (Math.abs(d1-d2) < delta)
            return 0;
        else if (d1 > d2)
            return 1;
        else
            return -1;
    }    
}
