Расширение 2-значного числового диапазона алфавитом
У меня есть строка, представляющая уникальное значение с 2-значным числовым префиксом + фиксированный код + собственное значение (идентификатор оператора), как это
01 DD001,01 DD002,..,99 DD999
Строка имеет заданную длину, и длина DD-части не может быть изменена. Когда я проектировал этот уникальный идентификатор, мне сказали, что префикс никогда не будет превышать 99. Теперь мы должны расширить префикс, так как идентификатор оператора превысил 99. Поэтому, если я хочу расширить диапазон, я должен изменить десятичный префикс до двухзначного шестнадцатеричный, который дает мне диапазон 0-256. Другое возможное решение состоит в том, чтобы угрожать ему как строке и использовать весь алфавит для расширения возможного числа уникальных идентификаторов, как это
100 = A0 ,
111 = B1 ,
129 = C9...
Таким образом, вопрос в том, есть ли какая-нибудь библиотека, которая будет использовать второй подход (или simmilar)
2 ответа
Ты можешь использовать BigInteger
, У него есть удобная строка toString(int radix), которую можно использовать с основанием до Character.MAX_RADIX, которое обычно 36
давая вам максимальное значение ZZ
знак равно 1295
,
Вы всегда можете придумать свою собственную систему нумерации. Вот пример, который довольно хорошо сформирован и обратим, но дает вам только диапазон 0 - 1036
если вы ограничены только прописными буквами.
/**
* Number system where 0-99 appear as 0-99 but beyond that we can use A-Z.
*
* @param n - The number to convert.
* @return - It's representation in this strange form.
*/
public static String strangeNumber(int n) {
if (n < 100) {
// 0 - 99 - The old way.
String s = "00" + n;
return s.substring(s.length() - 2);
} else {
// Done the first 100.
n -= 100;
// First digit is now 'A', 'B' ...
int firstDigit = 'A' + (n / 36);
if (firstDigit > 'Z') {
throw new NumberFormatException("Cannot format number " + n);
}
int remainder = n % 36;
int secondDigit = remainder < 10 ? '0' + remainder : 'A' + (remainder - 10);
return Character.toString((char) firstDigit) + Character.toString((char) secondDigit);
}
}
public void test() {
for (int i = 0; i < 1036; i++) {
System.out.println(i + " = " + strangeNumber(i));
}
}