天天看點

【開發者筆記】進制轉換

需求:

  很簡單的一個需求,就是:把1變成A,2變B,超過了Z就從A0開始,AA,AB,AC……

原理:

  這就是一個實作【Integer.toHexString(123)】方法的問題,上述中輸入字元串為123456789ABCDEF就是toHexString,輸入字元串是1234567就是toOctalString,

  輸入字元串是1就是toBinaryString。那麼記錄一下原理吧

  十進制轉k進制的原則是整數部分除k取餘,小數部分乘k取整

  那麼用A-Z來表示數其實就是另類的27進制(26個字母+數字0),由于我們面對的隻是整數,那麼就講A-Z存在一個字元串中,然後對數字進行除27取餘,

  在用餘數去找數組中對應的字元,然後存到一個StringBuilder裡面,最後傳回結果的時候reverse一下就ok了。

邊界條件考慮:

  0:那麼直接傳回0

  負數:先判斷數字的符号,将符号存在一個sign變量裡面,最後追加到StringBuilder中即可,然後把負數乘上-1當成正數來處理

  

編碼:

package com.dyi.string;

public class KBaseNumber {
	public static void main(String[] args) {
		for (int i = -100; i < 100; i++) {
			System.out.print("" + i + "__十進制: "
					+ parseKBase(i, "123456789".split("")));
			System.out.print(",   " + "八進制: "
					+ parseKBase(i, "1234567".split("")));
			System.out.print(",   " + "16進制: "
					+ parseKBase(i, "123456789ABCDEF".split("")));
			System.out.print(",   " + "A-Z進制: " + parseKBase(i));
			System.out.println(",   " + "二進制: " + parseKBase(i, "1".split("")));
		}
	}

	public static String parseKBase(int num) {
		String[] base = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
		return parseKBase(num, base);
	}

	public static String parseKBase(int num, String[] base) {
		if (num == 0) {
			return "0";
		}

		int k = base.length;
		String sign = num >= 0 ? "" : "-";
		num = num >= 0 ? num : -num;
		StringBuilder result = new StringBuilder();

		while (num > 0) {
			int idx = num % k;
			num = num / k;
			if (idx == 0) {
				result.append("0");
			} else {
				result.append(base[idx]);
			}
		}
		result.append(sign);
		return result.reverse().toString();
	}
}
      

結果:

【開發者筆記】進制轉換

朋友問的問題,順手記錄一下~

黑夜給了我黑色的眼睛,我卻用它尋找光明

繼續閱讀