我有字符串表示单值,带有2位数字前缀+固定代码+自己的值(操作员ID),如下所示
01 DD001, 01 DD002,.., 99 DD999
字符串给定长度,DD部分的长度可以改变。当我设计这个unigue标识符时,我被告知,前缀永远不会超过99.现在我们必须扩展前缀,因为操作员ID超过99.所以如果我想扩展范围,我必须将十进制前缀更改为两位数十六进制,给我范围0-256。 其他可行的解决方案是将其威胁为字符串并使用整个字母表来扩展唯一标识符的可用数量
100 = A0 ,
111 = B1 ,
129 = C9...
所以问题是是否有一些库会使用第二种方法(或类似的)
答案 0 :(得分:1)
您可以使用BigInteger
。它有一个方便的toString(int radix),您可以使用最高Character.MAX_RADIX的基数,通常为36
,最大值为ZZ
= 1295
。
答案 1 :(得分:0)
您可以随时创建自己的编号系统。这是一个相当好的形式和可逆的示例,但如果仅限于大写,则只给出一系列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));
}
}