aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/dev/isxander/yacl/impl/utils
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/dev/isxander/yacl/impl/utils')
-rw-r--r--src/main/java/dev/isxander/yacl/impl/utils/NumberFormatHelper.java38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/main/java/dev/isxander/yacl/impl/utils/NumberFormatHelper.java b/src/main/java/dev/isxander/yacl/impl/utils/NumberFormatHelper.java
new file mode 100644
index 0000000..bbf44a1
--- /dev/null
+++ b/src/main/java/dev/isxander/yacl/impl/utils/NumberFormatHelper.java
@@ -0,0 +1,38 @@
+package dev.isxander.yacl.impl.utils;
+
+import org.jetbrains.annotations.ApiStatus;
+
+import java.util.Map;
+import java.util.NavigableMap;
+import java.util.TreeMap;
+
+@ApiStatus.Internal
+public class NumberFormatHelper {
+ private static final NavigableMap<Long, String> suffixes = new TreeMap<>();
+ static {
+ suffixes.put(1_000L, "K");
+ suffixes.put(1_000_000L, "M");
+ suffixes.put(1_000_000_000L, "B");
+ suffixes.put(1_000_000_000_000L, "T");
+ suffixes.put(1_000_000_000_000_000L, "P");
+ suffixes.put(1_000_000_000_000_000_000L, "E");
+ }
+
+ /**
+ * @author <a href="https://stackoverflow.com/a/30661479">assylias</a>
+ */
+ public static String formatSmaller(long value) {
+ // Long.MIN_VALUE == -Long.MIN_VALUE, so we need an adjustment here
+ if (value == Long.MIN_VALUE) return formatSmaller(Long.MIN_VALUE + 1);
+ if (value < 0) return "-" + formatSmaller(-value);
+ if (value < 1000) return Long.toString(value); //deal with easy case
+
+ Map.Entry<Long, String> e = suffixes.floorEntry(value);
+ Long divideBy = e.getKey();
+ String suffix = e.getValue();
+
+ long truncated = value / (divideBy / 10); //the number part of the output times 10
+ boolean hasDecimal = truncated < 100 && (truncated / 10d) != (truncated / 10);
+ return hasDecimal ? (truncated / 10d) + suffix : (truncated / 10) + suffix;
+ }
+}