| package universalelectricity.core.electricity; |
| |
| /** |
| * An easy way to display information on electricity for the client. |
| * |
| * @author Calclavia |
| */ |
| public class ElectricityDisplay |
| { |
| /** |
| * Universal Electricity's units are in KILOJOULES, KILOWATTS and KILOVOLTS. Try to make your |
| * energy ratio as close to real life as possible. |
| */ |
| public static enum ElectricUnit |
| { |
| AMPERE("Amp", "I"), AMP_HOUR("Amp Hour", "Ah"), VOLTAGE("Volt", "V"), WATT("Watt", "W"), |
| WATT_HOUR("Watt Hour", "Wh"), RESISTANCE("Ohm", "R"), CONDUCTANCE("Siemen", "S"), |
| JOULES("Joule", "J"); |
| |
| public String name; |
| public String symbol; |
| |
| private ElectricUnit(String name, String symbol) |
| { |
| this.name = name; |
| this.symbol = symbol; |
| } |
| |
| public String getPlural() |
| { |
| return this.name + "s"; |
| } |
| } |
| |
| /** Metric system of measurement. */ |
| public static enum MeasurementUnit |
| { |
| MICRO("Micro", "u", 0.000001f), MILLI("Milli", "m", 0.001f), BASE("", "", 1), |
| KILO("Kilo", "k", 1000f), MEGA("Mega", "M", 1000000f), GIGA("Giga", "G", 1000000000f), |
| TERA("Tera", "T", 1000000000000f), PETA("Peta", "P", 1000000000000000f), |
| EXA("Exa", "E", 1000000000000000000f), ZETTA("Zetta", "Z", 1000000000000000000000f), |
| YOTTA("Yotta", "Y", 1000000000000000000000000f); |
| |
| /** long name for the unit */ |
| public String name; |
| /** short unit version of the unit */ |
| public String symbol; |
| /** Point by which a number is consider to be of this unit */ |
| public float value; |
| |
| private MeasurementUnit(String name, String symbol, float value) |
| { |
| this.name = name; |
| this.symbol = symbol; |
| this.value = value; |
| } |
| |
| public String getName(boolean getShort) |
| { |
| if (getShort) |
| { |
| return symbol; |
| } |
| else |
| { |
| return name; |
| } |
| } |
| |
| /** Divides the value by the unit value start */ |
| public double process(double value) |
| { |
| return value / this.value; |
| } |
| |
| /** Checks if a value is above the unit value start */ |
| public boolean isAbove(float value) |
| { |
| return value > this.value; |
| } |
| |
| /** Checks if a value is lower than the unit value start */ |
| public boolean isBellow(float value) |
| { |
| return value < this.value; |
| } |
| } |
| |
| /** By default, mods should store energy in Kilo-Joules, hence a multiplier of 1/1000. */ |
| public static String getDisplay(float value, ElectricUnit unit, int decimalPlaces, boolean isShort) |
| { |
| return getDisplay(value, unit, decimalPlaces, isShort, 1000); |
| } |
| |
| /** |
| * Displays the unit as text. Does handle negative numbers, and will place a negative sign in |
| * front of the output string showing this. Use string.replace to remove the negative sign if |
| * unwanted |
| */ |
| public static String getDisplay(float value, ElectricUnit unit, int decimalPlaces, boolean isShort, float multiplier) |
| { |
| String unitName = unit.name; |
| String prefix = ""; |
| if (value < 0) |
| { |
| value = Math.abs(value); |
| prefix = "-"; |
| } |
| value *= multiplier; |
| |
| if (isShort) |
| { |
| unitName = unit.symbol; |
| } |
| else if (value > 1) |
| { |
| unitName = unit.getPlural(); |
| } |
| |
| if (value == 0) |
| { |
| return value + " " + unitName; |
| } |
| else |
| { |
| for (int i = 0; i < MeasurementUnit.values().length; i++) |
| { |
| MeasurementUnit lowerMeasure = MeasurementUnit.values()[i]; |
| if (lowerMeasure.isBellow(value) && lowerMeasure.ordinal() == 0) |
| { |
| return prefix + roundDecimals(lowerMeasure.process(value), decimalPlaces) + " " + lowerMeasure.getName(isShort) + unitName; |
| } |
| if (lowerMeasure.ordinal() + 1 >= MeasurementUnit.values().length) |
| { |
| return prefix + roundDecimals(lowerMeasure.process(value), decimalPlaces) + " " + lowerMeasure.getName(isShort) + unitName; |
| } |
| MeasurementUnit upperMeasure = MeasurementUnit.values()[i + 1]; |
| if ((lowerMeasure.isAbove(value) && upperMeasure.isBellow(value)) || lowerMeasure.value == value) |
| { |
| return prefix + roundDecimals(lowerMeasure.process(value), decimalPlaces) + " " + lowerMeasure.getName(isShort) + unitName; |
| } |
| } |
| } |
| |
| return prefix + roundDecimals(value, decimalPlaces) + " " + unitName; |
| } |
| |
| public static String getDisplay(float value, ElectricUnit unit) |
| { |
| return getDisplay(value, unit, 2, false); |
| } |
| |
| public static String getDisplayShort(float value, ElectricUnit unit) |
| { |
| return getDisplay(value, unit, 2, true); |
| } |
| |
| public static String getDisplayShort(float value, ElectricUnit unit, int decimalPlaces) |
| { |
| return getDisplay(value, unit, decimalPlaces, true); |
| } |
| |
| public static String getDisplaySimple(float value, ElectricUnit unit, int decimalPlaces) |
| { |
| if (value > 1) |
| { |
| if (decimalPlaces < 1) |
| { |
| return (int) value + " " + unit.getPlural(); |
| } |
| |
| return roundDecimals(value, decimalPlaces) + " " + unit.getPlural(); |
| } |
| |
| if (decimalPlaces < 1) |
| { |
| return (int) value + " " + unit.name; |
| } |
| |
| return roundDecimals(value, decimalPlaces) + " " + unit.name; |
| } |
| |
| /** |
| * Rounds a number to a specific number place places |
| * |
| * @param The number |
| * @return The rounded number |
| */ |
| public static double roundDecimals(double d, int decimalPlaces) |
| { |
| int j = (int) (d * Math.pow(10, decimalPlaces)); |
| return j / Math.pow(10, decimalPlaces); |
| } |
| |
| public static double roundDecimals(double d) |
| { |
| return roundDecimals(d, 2); |
| } |
| } |