package cc.fascinated.bat.common; import java.text.DecimalFormat; import java.util.Locale; /** * @author Fascinated (fascinated7) */ public class NumberFormatter { /** * The suffixes for the numbers */ private static final String[] SUFFIXES = new String[] { "K", "M", "B", "T", "Q", "QT", "S", "SP", "O", "N", "D", "UD", "DD", "TD" }; private static final DecimalFormat FORMAT = new DecimalFormat("###.##"); /** * Format the provided double * * @param input the value to format * @return the formatted double, in the format of xx.xx[suffix] */ public static String format(double input) { if (Double.isNaN(input)) { return "ERROR"; } if (Double.isInfinite(input) || input == Double.MAX_VALUE) { return "∞"; } if (1000 > input) { return FORMAT.format(input); } double power = (int) Math.log10(input); int index = (int) Math.floor(power / 3) - 1; double factor = input / Math.pow(10, 3 + index * 3); if (index >= SUFFIXES.length) { return "ERROR"; } return FORMAT.format(factor) + SUFFIXES[index]; } /** * Format the provided double with commas * * @param input the value to format * @return the formatted double, in the format of xx,xxx,xxx */ public static String formatCommas(double input) { return String.format("%,.0f", input); } /** * Turns a provided string into a double, for example 1M -> 1000000.00 * Accepts decimal and negative values and is not case-sensitive * * @param input the string to convert * @return the value the string represents */ public static double fromString(String input) { if ((input = input.trim()).isEmpty()) { return -1D; } try { double value = Double.parseDouble(input); // parse pure numbers if (Double.isNaN(value) || Double.isInfinite(value)) { return -1; } return value; } catch (NumberFormatException ignored) { input = input.toUpperCase(Locale.UK); for (int i = SUFFIXES.length - 1; i > 0; i--) { String suffix = SUFFIXES[i]; if (!input.endsWith(suffix)) { continue; } String amount = input.substring(0, input.length() - suffix.length()); if (!amount.isEmpty()) { return Double.parseDouble(amount) * Math.pow(10, 3 + i * 3); } } } return -1; } }