public String getNextsubDocNum(String docnum) throws Exception {
String[] evnval = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H",
"I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c",
"d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x",
"y", "z" }; // MAPPING <<
String jonstr62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; // 對應 文字的數字
String rexStr = "^[\\w]+$"; // 驗證 字串 是否 是數字 與 英文
if (!Pattern.matches(rexStr, docnum)) {
return "0-ERROR FORMATE"; // 若不是指定的格式 則回傳
}
BigInteger bei_chu_shu = new BigInteger("0");
for (int i = 0; i < docnum.length(); i++) {
int cop = (docnum.length() - i) - 1; // 次方
int log = jonstr62.indexOf(docnum.charAt(i)); // 位數值
BigInteger id = new BigInteger("62").pow(cop);// 62進制 N 次方
bei_chu_shu = bei_chu_shu.add(new BigInteger(String.valueOf(log)).multiply(id)); // 算出 10進制
}
bei_chu_shu = bei_chu_shu.add(BigInteger.ONE); // 下一個值 +1
BigInteger chu_shu = new BigInteger("62"); // 準備 62進制
BigInteger yu = BigInteger.ZERO; //
String shang = "";// 商
String sum = "";// 最後顯示的結果
while (!bei_chu_shu.equals(BigInteger.ZERO)) {
yu = bei_chu_shu.divide(chu_shu);// 餘數=被除數 / 除數
shang = String.valueOf(yu.subtract(yu.subtract(bei_chu_shu.mod(chu_shu))));// 餘數
bei_chu_shu = yu;// 讓下次迴圈的 被除數= 目前的 餘數
sum = evnval[Integer.valueOf(shang)] + sum;// 答案
}
return sum;
}
2018年3月9日 星期五
62進位 使用 Bigintger 轉 10進制 轉回 62進制
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言