Расширение 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));
    }
}
Другие вопросы по тегам