From 9b6cd4f3977040698014aa3b67ad8b0bb03fb72b Mon Sep 17 00:00:00 2001 From: kobenlys Date: Fri, 2 Oct 2026 14:11:49 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=EB=B0=B0=EC=A7=80=20=ED=86=A0?= =?UTF-8?q?=ED=81=B0=20=ED=91=9C=EA=B8=B0=EB=A5=BC=20=EB=B0=98=EC=98=AC?= =?UTF-8?q?=EB=A6=BC=20=EB=8C=80=EC=8B=A0=20=EC=86=8C=EC=88=98=20=EC=B2=AB?= =?UTF-8?q?=EC=A7=B8=20=EC=9E=90=EB=A6=AC=EC=97=90=EC=84=9C=20=EC=9E=90?= =?UTF-8?q?=EB=A5=B4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 1.76B → 1.7B, 999.96M → 999.9M (기존 1.8B, 1000.0M) - 표시값이 실제 값을 넘지 않아 레벨 임계값 근처에서 숫자와 레벨 일치 - 반올림 경계값 테스트 6건 추가 --- .../api/feature/badge/svg/SvgText.java | 17 +++++++++++----- .../api/feature/badge/svg/SvgTextTest.java | 20 +++++++++++++++++++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/tokenphage/api/feature/badge/svg/SvgText.java b/src/main/java/com/tokenphage/api/feature/badge/svg/SvgText.java index 67f8c43..943959c 100644 --- a/src/main/java/com/tokenphage/api/feature/badge/svg/SvgText.java +++ b/src/main/java/com/tokenphage/api/feature/badge/svg/SvgText.java @@ -30,7 +30,8 @@ public static String escape(String s) { /** * 토큰 수를 읽기 쉬운 단위 문자열로 변환한다. *

- * 1K / 1M / 1B / 1T 단위로 표시하며 소수점 첫째 자리를 유지한다. (예: 1500 → "1.5K") + * 1K / 1M / 1B / 1T 단위로 표시하며 소수점 첫째 자리까지 남기고 나머지는 자른다. (예: 1760 → "1.7K") + * 반올림하지 않으므로 표시값이 실제 값을 넘지 않아, 레벨 임계값 근처에서도 숫자와 레벨이 어긋나지 않는다. * * @param tokens 변환할 토큰 수 * @return 단위 변환된 문자열 @@ -38,11 +39,17 @@ public static String escape(String s) { */ public static String formatTokens(long tokens) { return switch (Long.valueOf(tokens)) { - case Long l when l >= 1_000_000_000_000L -> String.format("%.1fT", l / 1_000_000_000_000.0); - case Long l when l >= 1_000_000_000L -> String.format("%.1fB", l / 1_000_000_000.0); - case Long l when l >= 1_000_000L -> String.format("%.1fM", l / 1_000_000.0); - case Long l when l >= 1_000L -> String.format("%.1fK", l / 1_000.0); + case Long l when l >= 1_000_000_000_000L -> truncate(l, 1_000_000_000_000L, "T"); + case Long l when l >= 1_000_000_000L -> truncate(l, 1_000_000_000L, "B"); + case Long l when l >= 1_000_000L -> truncate(l, 1_000_000L, "M"); + case Long l when l >= 1_000L -> truncate(l, 1_000L, "K"); default -> String.valueOf(tokens); }; } + + // 단위로 나눈 값을 소수 첫째 자리에서 자른다. 정수 연산이라 부동소수 오차가 없다. + private static String truncate(long tokens, long unit, String suffix) { + long tenths = tokens / (unit / 10); + return tenths / 10 + "." + tenths % 10 + suffix; + } } diff --git a/src/test/java/com/tokenphage/api/feature/badge/svg/SvgTextTest.java b/src/test/java/com/tokenphage/api/feature/badge/svg/SvgTextTest.java index a03938e..c529acb 100644 --- a/src/test/java/com/tokenphage/api/feature/badge/svg/SvgTextTest.java +++ b/src/test/java/com/tokenphage/api/feature/badge/svg/SvgTextTest.java @@ -23,6 +23,26 @@ void formatTokens_correctUnit(long tokens, String expected) { assertThat(SvgText.formatTokens(tokens)).isEqualTo(expected); } + @ParameterizedTest(name = "[{index}] {0} → {1}") + @DisplayName("소수 첫째 자리에서 자르고 반올림하지 않는다 — 표시값이 실제 값을 넘지 않는다") + @CsvSource({ + "1760000000, 1.7B", // 반올림이면 1.8B + "1960000000, 1.9B", // 반올림이면 2.0B + "999960000, 999.9M", // 반올림이면 1000.0M (단위 넘침) + "99960000, 99.9M", // Lv.3 임계(100M) 직전 — 반올림이면 100.0M + "999950, 999.9K", // 반올림이면 1000.0K + "999999999999, 999.9B" // T 단위 직전 — 반올림이면 1000.0B + }) + void 토큰표기_반올림경계값_소수첫째자리에서자름(long tokens, String expected) { + // given: 반올림하면 한 자리가 올라가는 경계값 + + // when + String actual = SvgText.formatTokens(tokens); + + // then: 레벨은 원값으로 판정하므로, 표시가 올라가면 임계값 근처에서 숫자와 레벨이 어긋난다 + assertThat(actual).isEqualTo(expected); + } + @ParameterizedTest @DisplayName("XML 특수문자를 이스케이프한다") @CsvSource({ From 830adbc0048a211935ef7c8fca23d8ab20f4d395 Mon Sep 17 00:00:00 2001 From: kobenlys Date: Fri, 2 Oct 2026 14:11:49 +0900 Subject: [PATCH 2/2] =?UTF-8?q?chore:=20=EB=B2=84=EC=A0=84=2026.10.01?= =?UTF-8?q?=EB=A1=9C=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c1b5ca8..ade4c43 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.tokenphage tokenphage-api - 26.08.26 + 26.10.01 tokenphage-api