mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-25 00:50:22 +00:00
AK: Fix DeprecatedString::bijective_base_from for large numbers
The output of the DeprecatedString::bijective_base_from() is now correct for numbers larger than base^2. This makes column names display correctly in Spreadsheet.
This commit is contained in:
parent
fa34832297
commit
6b2f3ad6c8
Notes:
sideshowbarker
2024-07-17 00:49:59 +09:00
Author: https://github.com/tcl3 Commit: https://github.com/SerenityOS/serenity/commit/6b2f3ad6c8 Pull-request: https://github.com/SerenityOS/serenity/pull/17608 Reviewed-by: https://github.com/alimpfard
2 changed files with 14 additions and 9 deletions
|
@ -246,6 +246,7 @@ DeprecatedString DeprecatedString::repeated(StringView string, size_t count)
|
|||
|
||||
DeprecatedString DeprecatedString::bijective_base_from(size_t value, unsigned base, StringView map)
|
||||
{
|
||||
value++;
|
||||
if (map.is_null())
|
||||
map = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"sv;
|
||||
|
||||
|
@ -255,15 +256,16 @@ DeprecatedString DeprecatedString::bijective_base_from(size_t value, unsigned ba
|
|||
Array<char, round_up_to_power_of_two(sizeof(size_t) * 8 + 1, 2)> buffer;
|
||||
size_t i = 0;
|
||||
do {
|
||||
buffer[i++] = map[value % base];
|
||||
value /= base;
|
||||
} while (value > 0);
|
||||
auto remainder = value % base;
|
||||
auto new_value = value / base;
|
||||
if (remainder == 0) {
|
||||
new_value--;
|
||||
remainder = map.length();
|
||||
}
|
||||
|
||||
// NOTE: Weird as this may seem, the thing that comes after 'Z' is 'AA', which as a number would be '00'
|
||||
// to make this work, only the most significant digit has to be in a range of (1..25) as opposed to (0..25),
|
||||
// but only if it's not the only digit in the string.
|
||||
if (i > 1)
|
||||
--buffer[i - 1];
|
||||
buffer[i++] = map[remainder - 1];
|
||||
value = new_value;
|
||||
} while (value > 0);
|
||||
|
||||
for (size_t j = 0; j < i / 2; ++j)
|
||||
swap(buffer[j], buffer[i - j - 1]);
|
||||
|
|
|
@ -290,7 +290,10 @@ TEST_CASE(bijective_base)
|
|||
EXPECT_EQ(DeprecatedString::bijective_base_from(25), "Z");
|
||||
EXPECT_EQ(DeprecatedString::bijective_base_from(26), "AA");
|
||||
EXPECT_EQ(DeprecatedString::bijective_base_from(52), "BA");
|
||||
EXPECT_EQ(DeprecatedString::bijective_base_from(704), "ABC");
|
||||
EXPECT_EQ(DeprecatedString::bijective_base_from(701), "ZZ");
|
||||
EXPECT_EQ(DeprecatedString::bijective_base_from(702), "AAA");
|
||||
EXPECT_EQ(DeprecatedString::bijective_base_from(730), "ABC");
|
||||
EXPECT_EQ(DeprecatedString::bijective_base_from(18277), "ZZZ");
|
||||
}
|
||||
|
||||
TEST_CASE(roman_numerals)
|
||||
|
|
Loading…
Reference in a new issue