Skip to content

Commit e877708

Browse files
committed
add a workaround for formatted string
1 parent 0e8881c commit e877708

File tree

1 file changed

+31
-1
lines changed

1 file changed

+31
-1
lines changed

spigot/plugin/src/main/java/me/hsgamer/topper/spigot/plugin/holder/provider/NumberStringValueProvider.java

+31-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ public abstract class NumberStringValueProvider implements ValueProvider {
1414
protected final TopperPlugin plugin;
1515
private final boolean isAsync;
1616
private final boolean showErrors;
17+
private final boolean isFormatted;
18+
private final char decimalSeparator;
1719

1820
public NumberStringValueProvider(TopperPlugin plugin, Map<String, Object> map) {
1921
this.plugin = plugin;
@@ -27,17 +29,45 @@ public NumberStringValueProvider(TopperPlugin plugin, Map<String, Object> map) {
2729
.map(String::toLowerCase)
2830
.map(Boolean::parseBoolean)
2931
.orElse(false);
32+
isFormatted = Optional.ofNullable(map.get("formatted"))
33+
.map(Object::toString)
34+
.map(String::toLowerCase)
35+
.map(Boolean::parseBoolean)
36+
.orElse(false);
37+
decimalSeparator = Optional.ofNullable(map.get("decimal-separator"))
38+
.map(Object::toString)
39+
.filter(s -> !s.isEmpty())
40+
.map(s -> s.charAt(0))
41+
.orElse('.');
3042
}
3143

3244
protected abstract String getDisplayName();
3345

3446
protected abstract Optional<String> getString(UUID uuid);
3547

48+
private String parseValue(String string) {
49+
if (!isFormatted) {
50+
return string;
51+
}
52+
53+
StringBuilder builder = new StringBuilder();
54+
boolean decimalSeparatorFound = false;
55+
for (char c : string.toCharArray()) {
56+
if (Character.isDigit(c)) {
57+
builder.append(c);
58+
} else if (!decimalSeparatorFound && c == decimalSeparator) {
59+
builder.append('.');
60+
decimalSeparatorFound = true;
61+
}
62+
}
63+
return builder.toString();
64+
}
65+
3666
@Override
3767
public CompletableFuture<Optional<Double>> getValue(UUID uuid) {
3868
return CompletableFuture.supplyAsync(() -> {
3969
try {
40-
Optional<String> value = getString(uuid);
70+
Optional<String> value = getString(uuid).filter(s -> !s.isEmpty()).map(this::parseValue);
4171
if (!value.isPresent()) {
4272
if (showErrors) {
4373
plugin.getLogger().warning("The value of " + getDisplayName() + " is empty");

0 commit comments

Comments
 (0)