From e8777085ed783ee12d75dd828604b8002d25f499 Mon Sep 17 00:00:00 2001 From: hsgamer Date: Fri, 31 Jan 2025 20:22:09 +0700 Subject: [PATCH] add a workaround for formatted string --- .../provider/NumberStringValueProvider.java | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/spigot/plugin/src/main/java/me/hsgamer/topper/spigot/plugin/holder/provider/NumberStringValueProvider.java b/spigot/plugin/src/main/java/me/hsgamer/topper/spigot/plugin/holder/provider/NumberStringValueProvider.java index 37682b2..36942bd 100644 --- a/spigot/plugin/src/main/java/me/hsgamer/topper/spigot/plugin/holder/provider/NumberStringValueProvider.java +++ b/spigot/plugin/src/main/java/me/hsgamer/topper/spigot/plugin/holder/provider/NumberStringValueProvider.java @@ -14,6 +14,8 @@ public abstract class NumberStringValueProvider implements ValueProvider { protected final TopperPlugin plugin; private final boolean isAsync; private final boolean showErrors; + private final boolean isFormatted; + private final char decimalSeparator; public NumberStringValueProvider(TopperPlugin plugin, Map map) { this.plugin = plugin; @@ -27,17 +29,45 @@ public NumberStringValueProvider(TopperPlugin plugin, Map map) { .map(String::toLowerCase) .map(Boolean::parseBoolean) .orElse(false); + isFormatted = Optional.ofNullable(map.get("formatted")) + .map(Object::toString) + .map(String::toLowerCase) + .map(Boolean::parseBoolean) + .orElse(false); + decimalSeparator = Optional.ofNullable(map.get("decimal-separator")) + .map(Object::toString) + .filter(s -> !s.isEmpty()) + .map(s -> s.charAt(0)) + .orElse('.'); } protected abstract String getDisplayName(); protected abstract Optional getString(UUID uuid); + private String parseValue(String string) { + if (!isFormatted) { + return string; + } + + StringBuilder builder = new StringBuilder(); + boolean decimalSeparatorFound = false; + for (char c : string.toCharArray()) { + if (Character.isDigit(c)) { + builder.append(c); + } else if (!decimalSeparatorFound && c == decimalSeparator) { + builder.append('.'); + decimalSeparatorFound = true; + } + } + return builder.toString(); + } + @Override public CompletableFuture> getValue(UUID uuid) { return CompletableFuture.supplyAsync(() -> { try { - Optional value = getString(uuid); + Optional value = getString(uuid).filter(s -> !s.isEmpty()).map(this::parseValue); if (!value.isPresent()) { if (showErrors) { plugin.getLogger().warning("The value of " + getDisplayName() + " is empty");