package com.revolsys.util.number;
import com.revolsys.datatype.AbstractDataType;
import com.revolsys.datatype.DataTypes;
import com.revolsys.util.DoubleFormatUtil;
import com.revolsys.util.MathUtil;
import com.revolsys.util.Property;
public class Doubles extends AbstractDataType {
public static double add(final double left, final Number right) {
return left + right.doubleValue();
}
public static double divide(final double left, final Number right) {
return left / right.doubleValue();
}
public static boolean equal(final double number1, final double number2) {
if (Double.compare(number1, number2) == 0) {
return true;
} else {
return false;
}
}
public static boolean equal(final Object number1, final Object number2) {
return equal((double)number1, (double)number2);
}
public static double makePrecise(final double scale, final double value) {
if (scale <= 0) {
return value;
} else if (Double.isFinite(value)) {
final double multiple = value * scale;
final long scaledValue = Math.round(multiple);
final double preciseValue = scaledValue / scale;
return preciseValue;
} else {
return value;
}
}
public static double makePreciseCeil(final double scale, final double value) {
if (scale <= 0) {
return value;
} else if (Double.isFinite(value)) {
final double multiple = value * scale;
final long scaledValue = (long)Math.ceil(multiple);
final double preciseValue = scaledValue / scale;
return preciseValue;
} else {
return value;
}
}
public static double makePreciseFloor(final double scale, final double value) {
if (scale <= 0) {
return value;
} else if (Double.isFinite(value)) {
final double multiple = value * scale;
final long scaledValue = (long)Math.floor(multiple);
final double preciseValue = scaledValue / scale;
return preciseValue;
} else {
return value;
}
}
public static double mod(final double left, final Number right) {
return left % right.doubleValue();
}
public static double multiply(final double left, final Number right) {
return left * right.doubleValue();
}
public static boolean overlaps(final double min1, final double max1, final double min2,
final double max2) {
if (min1 > max1) {
return overlaps(max1, min1, min2, max2);
} else if (min2 > max2) {
return overlaps(min1, max1, max2, min2);
} else {
if (min1 <= max2 && min2 <= max1) {
return true;
} else {
return false;
}
}
}
public static double subtract(final double left, final Number right) {
return left - right.doubleValue();
}
public static Double toDouble(final Object value) {
try {
return toValid(value);
} catch (final Throwable e) {
return null;
}
}
public static Double toDouble(final String value) {
try {
return toValid(value);
} catch (final Throwable e) {
return null;
}
}
public static String toString(final double number) {
final StringBuilder string = new StringBuilder();
MathUtil.append(string, number);
return string.toString();
}
public static String toString(final double number, final int precision) {
final StringBuilder string = new StringBuilder();
DoubleFormatUtil.formatDoublePrecise(number, precision, precision, string);
return string.toString();
}
/**
* Convert the value to a Double. If the value cannot be converted to a number
* an exception is thrown
*/
public static Double toValid(final Object value) {
if (value == null) {
return null;
} else if (value instanceof Number) {
final Number number = (Number)value;
return number.doubleValue();
} else {
final String string = value.toString();
return toValid(string);
}
}
/**
* Convert the value to a Double. If the value cannot be converted to a number and exception is thrown.
*/
public static Double toValid(final String string) {
if (Property.hasValue(string)) {
return Double.valueOf(string);
} else {
return null;
}
}
public Doubles() {
super("double", Double.class, false);
}
@Override
protected boolean equalsNotNull(final Object value1, final Object value2) {
return equal((double)value1, (double)value2);
}
@Override
protected Object toObjectDo(final Object value) {
if (value instanceof Number) {
final Number number = (Number)value;
return number.doubleValue();
} else {
final String string = DataTypes.toString(value);
if (Property.hasValue(string)) {
return Double.valueOf(string);
} else {
return null;
}
}
}
@Override
protected String toStringDo(final Object value) {
return toString((double)value);
}
}