1. 程式人生 > >生成類似 excel 版本號 A ,B,C,...,Z AA,AB,..,AZ ...

生成類似 excel 版本號 A ,B,C,...,Z AA,AB,..,AZ ...

          生成類似 excel 版本號 A ,B,C,...,Z  AA,AB,..,AZ ...

  最近遇到一個需求:每次對一條記錄進行修改或指定操作,需要生成一個歷史版本,版本號需要採用類似excel表格的列號的形式,第一版本為A,第二版本為B,以此類推由A-Z,AA,AB,AC,...,AZ,ZZ,AAA-ZZZ。由於考慮到後面有根據版本號排序,根據版本號範圍查詢資料的需求,思考了一下,採用了資料庫的版本號欄位存的是數字1,2,3,4 ....分別對應A,,B,C,D ....,52對應AZ,這樣的一個對應關係,查詢到資料的時候把數字的版本號通過計算查詢出對應的字串版本(A,B,C...)在前臺展示。如果需要根據版本號去資料庫查詢資料,可以根據前臺傳入的字串版本號轉換後再拼接引數查詢,存數字最主要的是為了能更好的比較大小,下面把主要程式碼記錄一下,大家如果有什麼更好的解決方案,也可在下方留言大家一起討論。

  

    
    /**
     * 將字串(a-z)轉換成數字
     * 按照excel表格的列號(如:a-->1,z-->26,aa->27,az-52,....)
     * @param str
     * @return
     */
    public static int str2int(String str){
		char[] array = str.toCharArray();
		int result = 0;
		for (int j = 0; j < array.length; j++) {
			result*=26;
			result+=char2int(array[j]);
		}
		return result;
	};
	
	/**
	 * 將字元轉換成整數
	 * @param ch
	 * @return
	 */
	public static int char2int(char ch){
		int result = -1;
		if(ch >= 'A' && ch <= 'Z'){
			result = ch - 'A' + 1;
		}else if(ch >= 'a' && ch <= 'z'){
			result = ch - 'a' + 1;
		}
		return  result;
	}
	
	/**
	 * 將1轉換成A,26轉換成Z,無限往後推,對應excel表格的列
	 * @param num
	 * @return
	 */
	public static String int2Str(int num){
		String result = "";
		num = num <=0 ? 1 : num;//小於等於0是輸出A
		while(num > 0){
			int m = num %26;
			if(m == 0) m = 26;
			result = (char)(m + 64) + result;
			num = (num-m)/26;
		}
		return result;
	}