2017-07-25 50 views
2

我在C#中自定義數字系統都按以下要求:自定義數字系統在C#

A - 1 
B - 2 
... 
Z - 26 
AA - 27 
AB - 28 

我做了從任意的字符串轉換爲數字這樣的功能:

private const int Min = 'A'; 
    private const int Max = 'Z'; 
    private const int Base = Max - Min + 1; 

    private static int GetCharValue(char c) 
    { 
     if (c < Min || c > Max) 
      throw new ArgumentOutOfRangeException(nameof(c), c, $"Character needs to be between '{Min}' and '{Max}', was '{c}'."); 

     return c - Min + 1; 
    } 

    public static int GetStringValue(string s) 
    { 
     char[] chars = s.ToCharArray(); 
     int[] values = new int[chars.Length]; 
     for (var i = 0; i < chars.Length; i++) 
     { 
      values[i] = GetCharValue(chars[i]); 
     } 

     int position = 1; 
     int value = 0; 
     for (var i = values.Length - 1; i >= 0; i--) 
     { 
      value += position * values[i]; 
      position *= Base; 
     } 

     return value; 
    } 

我測試過其上工作長達AAA(不嚴謹,只是一掠而過打印它們所有的輸出)。但是,我不能爲我的生活弄清楚如何編寫反向函數。換句話說,我需要1回到A26返回Z27返回AA。 「問題」是這個數字系統沒有0,所以它不容易轉換到任何基地。例如,如果A爲0,那麼AA也將爲0,但事實並非如此。那麼我該如何解決這個問題?

+2

...或者'AAA'是'703'? –

+0

它看起來像你試圖創建一個base_n數字系統......但我不認爲'AA'應該代表你認爲它的作用 – Kritner

+0

「問題」是你的數字系統確實有一個零,但它不一致。這是一個奇怪的不是真正的定位系統。在'AA'中,第一個'A'是一個,而第二個'A'是零。 「AAA」是指011,010,100,101,110 ...?實際需求是什麼,只是客戶的一些模糊的期望,並不真正知道他想要什麼?還是你想複製Excel的座標系? – Luaan

回答

0

你可以簡單地生成它像這樣....

public static IEnumerable<string> generate() 
    { 
     long n = -1; 
     while (true) yield return toBase26(++n); 
    } 

    public static string toBase26(long i) 
    { 
     if (i == 0) return ""; i--; 
     return toBase26(i/26) + (char)('A' + i % 26); 
    } 



    public static void BuildQuery() 
    { 
     IEnumerable<string> lstExcelCols = generate(); 
     try 
     { 

      string s = lstExcelCols.ElementAtOrDefault(1) ; 
     } 
     catch (Exception exc) 
     { 

     } 


    }