遇到一項需求
英文序列:A, B, C … Z, AA, AB … AZ, BA, …
數字序列:1, 2, 3 … 99, 100, 101…
不同序列的編碼要轉換
類似Excel的橫列編號
牽扯到
一、10進位與26進位的轉換。這部分是數學知識。
二、字母與數字的轉換。這是關於 String、char 的知識。
英文轉數字(26進位轉10進位)
程式邏輯:
1. 每個字元個別計算
2. 算出英文字代表的值
3. 乘以26的次方,依照位數遞減
4. 計算和
範例:XIOP
X → 24 * 263 = 421824
I → 9 * 262 = 6084
O → 15 * 261 = 390
P → 16 * 260 = 16
421824 + 6084 + 390 + 16 = 428314
public int letterToNumber(String letter) {
letter = letter.toUpperCase();
if (!letter.matches("^[A-Z]+$")) {
throw new IllegalArgumentException();
}
int power = letter.length() - 1;
int sum = 0;
for (int i = 0; i < letter.length(); i++) {
char c = letter.charAt(i);
int ordinal = c - 64;
sum += ordinal * Math.pow(26, power);
power--;
}
return sum;
}
測試
System.out.println("A:\t" + letterToNumber("A"));
System.out.println("B:\t" + letterToNumber("B"));
System.out.println("Z:\t" + letterToNumber("Z"));
System.out.println("AA:\t" + letterToNumber("AA"));
System.out.println("AD:\t" + letterToNumber("AD"));
System.out.println("d:\t" + letterToNumber("d"));
數字轉英文(10進位轉26進位)
程式邏輯:
1. 將數字除以26,使用遞迴除到不能除
2. 記錄商與餘數
3. 將商與餘數轉換成對應的英文
4. 拼接字串
範例:428314
428314 / 26 = 16473…16
16473 / 26 = 633…15
633 / 26 = 24…9
24 → X
9 → I
15 → O
16 → P
public String numberToLetter(int number) {
if (number <= 0) {
throw new IllegalArgumentException();
}
String result = "";
List<Integer> list = new ArrayList<Integer>();
count(number, list);
for (int i : list) {
char c = (char) (i + 64);
result += c;
}
return result;
}
private void count(int number, List<Integer> list) {
int quotient = number / 26;
int remainder = number % 26;
if (quotient > 26) {
count(quotient, list);
} else {
list.add(quotient);
}
list.add(remainder);
}
測試
System.out.println("1:\t" + numberToLetter(1));
System.out.println("2:\t" + numberToLetter(2));
System.out.println("26:\t" + numberToLetter(26));
System.out.println("27:\t" + numberToLetter(27));
System.out.println("30:\t" + numberToLetter(30));