Convert.ToString() は、奇妙な理由で 2、8、10、および 16 の基本値のみを許可します。2 から 16 までの基数を提供するあいまいな方法はありますか?
6 に答える
おそらく、誰かが 8 ではなく 7 を入力するのを排除するためでしょう。任意の基数の使用はほとんどないためです (存在しないわけではありません)。
以下は、任意の基数変換を実行できるメソッドの例です。好きなだけ制限なく使えます。
string ConvertToBase(int value, int toBase)
{
if (toBase < 2 || toBase > 36) throw new ArgumentException("toBase");
if (value < 0) throw new ArgumentException("value");
if (value == 0) return "0"; //0 would skip while loop
string AlphaCodes = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string retVal = "";
while (value > 0)
{
retVal = AlphaCodes[value % toBase] + retVal;
value /= toBase;
}
return retVal;
}
テストされていませんが、ここから理解できるはずです。
//untested -- public domain
// if you do a lot of conversions, using StringBuilder will be
// much, much more efficient with memory and time than using string
// alone.
string toStringWithBase(int number, int base)
{
if(0==number) //handle corner case
return "0";
if(base < 2)
return "ERROR: Base less than 2";
StringBuilder buffer = new StringBuilder();
bool negative = (number < 0) ? true : false;
if(negative)
{
number=-number;
buffer.Append('-');
}
int digits=0;
int factor=1;
int runningTotal=number;
while(number > 0)
{
number = number/base;
digits++;
factor*=base;
}
factor = factor/base;
while(factor >= 1)
{
int remainder = (number/factor) % base;
Char out = '0'+remainder;
if(remainder > 9)
out = 'A' + remainder - 10;
buffer.Append(out);
factor = factor/base;
}
return buffer.ToString
}
次のことを試すことができます。
http://www.dotnetspider.com/resources/938-Conversion-Decimal-number-any-Base-vice.aspx
これは、少なくとも任意のベース (2->16) を持つことができるという印象を与えます。なぜあなたがしたいのかについて私は少し混乱していますが!
申し訳ありませんが、私はあなたの質問に答えていませんが... 塩基の選択は恣意的ではありません。あなたのPCは、底2(内部バイナリシステム)から人間が読める底10に常に変換しています.底8と16は、底2との間で変換するのが非常に簡単で、コンピューターと人間が値を読み取ることができるようによく使用されます(例: GUID)
string foo = Convert.ToString(myint,base);
http://msdn.microsoft.com/en-us/library/14kwkz77.aspx
編集:私の悪い、これはあなたが指定されたベース(2、8、10、および16)を渡さない限り引数例外をスローします
別のベースを使用したい場合は、おそらくSOLです(しかし、なぜですか?)。