Excelのカラム名(26進数ぽ)を数値(10進数)へ変換。頑張れ日本のC#er。
以前、数値をアルファベット(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からのお願いです(´∀`)
#追記
#誤字とか、なんかいろいろ恥ずかしい間違いを修正