Моему компоненту передается длинное значение, которое я позже использую в качестве ключа в кеше. Сам ключ является строковым представлением длинного значения, как если бы оно было 64-разрядным значением без знака. То есть, когда мой компонент передан -2944827264075010823L, мне нужно преобразовать его в строковый ключ "15501916809634540793".
У меня есть решение, но оно кажется грубой силой и меня тошнит. По сути, я конвертирую long в шестнадцатеричное строковое представление (так что -2944827264075010823L становится "d721df34a7ec6cf9") и конвертирую шестнадцатеричную строку в BigInteger:
String longValueAsHexString = convertLongToHexString(longValue);
BigInteger bi = new BigInteger(longValueAsHexString, 16);
String longValueString = bi.toString();
Затем я использую longValueString в качестве ключа в кеше.
Я не могу использовать Long.toString (longValue, 16), потому что он возвращает шестнадцатеричную строку для абсолютного значения с префиксом "-".
Итак, мой convertLongToHexString выглядит так:
long mask = 0x00000000ffffffffL;
long bottomHalf = number & mask;
long upperHalf = (number >> 32) & mask;
String bottomHalfString = Long.toString(bottomHalf, 16);
if (bottomHalfString.length() != 8) {
String zeroes = "0000000000000000";
bottomHalfString = zeroes.substring(16-bottomHalfString.length()) + bottomHalfString;
}
return Long.toString(upperHalf,16)+bottomHalfString;
Должен быть более элегантный способ сделать это. Есть предложения?