Files
Coalgov/CoalGov/src/main/java/com/librewiki/coalgov/util/CoalMoney.java
2026-05-04 17:00:18 +00:00

70 lines
2.2 KiB
Java

package com.librewiki.coalgov.util;
import java.math.BigDecimal;
import java.math.RoundingMode;
public final class CoalMoney {
public static final long CENTS_PER_COAL = 100L;
private CoalMoney() {
}
public static long fromCoal(double coal) {
return Math.round(coal * CENTS_PER_COAL);
}
public static long fromCoalConfig(double coal) {
return Math.max(0L, fromCoal(coal));
}
public static String format(long cents) {
boolean negative = cents < 0L;
long absolute = Math.abs(cents);
long coal = absolute / CENTS_PER_COAL;
long coalCents = absolute % CENTS_PER_COAL;
String prefix = negative ? "-" : "";
if (coal > 0L && coalCents > 0L) {
return prefix + coal + " coal " + coalCents + "cc";
}
if (coal > 0L) {
return prefix + coal + " coal";
}
return prefix + coalCents + "cc";
}
public static long parsePositive(String raw) {
long amount = parse(raw);
return amount > 0L ? amount : -1L;
}
public static long parse(String raw) {
if (raw == null) {
return -1L;
}
String normalized = raw.trim().toLowerCase();
if (normalized.isEmpty() || normalized.startsWith("-")) {
return -1L;
}
try {
if (normalized.endsWith("cc")) {
return Long.parseLong(normalized.substring(0, normalized.length() - 2));
}
if (normalized.endsWith("c")) {
return parseDecimalCoal(normalized.substring(0, normalized.length() - 1));
}
if (normalized.endsWith("coal")) {
return parseDecimalCoal(normalized.substring(0, normalized.length() - 4));
}
return parseDecimalCoal(normalized);
} catch (ArithmeticException | NumberFormatException exception) {
return -1L;
}
}
private static long parseDecimalCoal(String raw) {
BigDecimal coal = new BigDecimal(raw.trim());
BigDecimal cents = coal.multiply(BigDecimal.valueOf(CENTS_PER_COAL));
return cents.setScale(0, RoundingMode.HALF_UP).longValueExact();
}
}