mirror of
https://github.com/gosticks/iota.lib.java.git
synced 2025-10-16 11:45:37 +00:00
125 lines
3.8 KiB
Java
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;
|
|
}
|
|
|
|
}
|