読者です 読者をやめる 読者になる 読者になる
ようこそ。睡眠不足なプログラマのチラ裏です。

Excelのカラム名(26進数ぽ)を数値(10進数)へ変換。頑張れ日本のC#er。

プログラミング C#3.0

以前数値をアルファベット(26進数ぽ)へ変換、それはExcelのカラム名的な何か。という記事を書きました。
これは、10進数から26進数へ変換を行うだけの、ごくごく簡単なアルゴリズムです。


しかし、うちに来た人は「26進数から10進数 Excel 変換 C#というキーワードで検索をしてきていて、
どうも記事の内容とは逆のことがやりたいみたいでした。26進数(Excelのカラム名)から10進数への変換をお望みのようです。
わざわざググらなくても、2進数から10進数へ、あるいは16進数から10進数へ変換する方法を理解している方であれば、
造作もなくできそうなもんですが…。なんというか、アレです。日本のC#erがんばれ!


ということで、一応やり方を載せておきます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    static class Program
    {
        static void Main()
        {
            Console.WriteLine("CA".ToInt());
            Console.WriteLine((79).ToAlphabet());
            Console.WriteLine((100).ToAlphabet().ToInt().ToAlphabet().ToInt());
            Console.ReadKey();
        }

        /// <summary>
        /// 数値をExcelのカラム名的なアルファベット文字列へ変換します。
        /// </summary>
        /// <param name="self"></param>
        /// <returns>
        /// Excelのカラム名的なアルファベット文字列。
        /// (変換できない場合は、空文字を返します。)
        /// </returns>
        static string ToAlphabet(this int self)
        {
            if (self <= 0) return "";
            int n = self % 26;
            n = (n == 0) ? 26 : n;
            string s = ((char)(n + 64)).ToString();
            if (self == n) return s;
            return ((self - n) / 26).ToAlphabet() + s;
        }

        /// <summary>
        /// Excelのカラム名的なアルファベットを数値へ変換します。
        /// </summary>
        /// <param name="self"></param>
        /// <returns>
        /// 数値
        /// (変換できない場合は、0を返します。)
        /// </returns>
        static int ToInt(this string self)
        {
            int result = 0;
            if (string.IsNullOrEmpty(self)) return result;

            char[] chars = self.ToCharArray();
            int len = self.Length - 1;
            foreach (var c in chars)
            {
                int asc = (int)c - 64;
                if (asc < 1 || asc > 26) return 0;
                result += asc * (int)Math.Pow((double)26,(double)len--);
            }
            return result;
        }
    }
}


実行結果

79
CA
100


くれぐれも、ただコピペするんじゃなくて…、
理解してから使ってくださいね。zeclからのお願いです(´∀`)




#追記
#誤字とか、なんかいろいろ恥ずかしい間違いを修正