iota.lib.java/src/main/java/jota/utils/IotaUnitConverter.java
2017-02-18 20:37:26 +01:00

125 lines
3.8 KiB
Java

package jota.utils;
import java.text.DecimalFormat;
/**
* This class provides methods to convert Iota to different units.
*
* @author sascha
*/
public class IotaUnitConverter {
/**
* Convert the iota amount.
*
* @param amount The amount.
* @param fromUnit The source unit e.g. the unit of amount.
* @param toUnit The target unit.
* @return The specified amount in the target unit.
**/
public static long convertUnits(long amount, IotaUnits fromUnit, IotaUnits toUnit) {
long amountInSource = (long) (amount * Math.pow(10, fromUnit.getValue()));
return convertUnits(amountInSource, toUnit);
}
/**
* Convert unit.
*
* @param amount The amount.
* @param toUnit The target unit.
* @return The specified amount in the target unit.
**/
private static long convertUnits(long amount, IotaUnits toUnit) {
return (long) (amount / Math.pow(10, toUnit.getValue()));
}
/**
* Convert the iota amount to text.
*
* @param amount The amount.
* @param extended Extended length.
* @return The specified amount in the target unit.
**/
public static String convertRawIotaAmountToDisplayText(long amount, boolean extended) {
IotaUnits unit = findOptimalIotaUnitToDisplay(amount);
double amountInDisplayUnit = convertAmountTo(amount, unit);
return createAmountWithUnitDisplayText(amountInDisplayUnit, unit, extended);
}
/**
* Convert amount to target unit.
*
* @param amount The amount.
* @return The target unit.
**/
public static double convertAmountTo(long amount, IotaUnits target) {
return amount / Math.pow(10, target.getValue());
}
/**
* Create amount with unit text.
*
* @param amountInUnit The amount in units.
* @param unit The unit.
* @param extended Extended length.
* @return The target unit.
**/
private static String createAmountWithUnitDisplayText(double amountInUnit, IotaUnits unit, boolean extended) {
String result = createAmountDisplayText(amountInUnit, unit, extended);
result += " " + unit.getUnit();
return result;
}
/**
* Create amount text.
*
* @param amountInUnit The amount in units.
* @param unit The unit.
* @param extended Extended length.
* @return The target unit.
**/
public static String createAmountDisplayText(double amountInUnit, IotaUnits unit, boolean extended) {
DecimalFormat df;
if (extended) df = new DecimalFormat("##0.##################");
else
df = new DecimalFormat("##0.##");
String result = "";
// display unit as integer if value is between 1-999 or in decimal format
result += unit == IotaUnits.IOTA ? (long) amountInUnit : df.format(amountInUnit);
return result;
}
/**
* Finds the optimal unit to display the specified amount in.
*
* @param amount The amount.
* @return The optimal IotaUnit.
**/
public static IotaUnits findOptimalIotaUnitToDisplay(long amount) {
int length = String.valueOf(amount).length();
if (amount < 0) {// do not count "-" sign
length -= 1;
}
IotaUnits units = IotaUnits.IOTA;
if (length >= 1 && length <= 3) {
units = IotaUnits.IOTA;
} else if (length > 3 && length <= 6) {
units = IotaUnits.KILO_IOTA;
} else if (length > 6 && length <= 9) {
units = IotaUnits.MEGA_IOTA;
} else if (length > 9 && length <= 12) {
units = IotaUnits.GIGA_IOTA;
} else if (length > 12 && length <= 15) {
units = IotaUnits.TERA_IOTA;
} else if (length > 15 && length <= 18) {
units = IotaUnits.PETA_IOTA;
}
return units;
}
}