ふにゃるんv2

もとは、http://d.hatena.ne.jp/Wacky/

"0x"プレフィクスの付いた数文字の変換方法

ちょっとメモメモ。

C言語だと、"sscanf(inbuf, "%i", &val);"とするんですが、.NETとPythonで、10/16進数を一緒に解釈する方法って何じゃらほい?と思ったので。

$ ipy.exe -X:ColorfulConsole -X:AutoIndent -X:TabCompletion
IronPython 1.0 (1.0.61005.1977) on .NET 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
>>> import clr
>>> import System
>>> help(System.Convert.ToInt32)
Help on built-in function ToInt32

 |  ToInt32(...)
 |          int ToInt32(str value, int fromBase)
 |          int ToInt32(object value)
 |          int ToInt32(object value, IFormatProvider provider)
 |          int ToInt32(bool value)
 |          int ToInt32(Char value)
 |          int ToInt32(SByte value)
 |          int ToInt32(Byte value)
 |          int ToInt32(Int16 value)
 |          int ToInt32(UInt16 value)
 |          int ToInt32(UInt32 value)
 |          int ToInt32(int value)
 |          int ToInt32(Int64 value)
 |          int ToInt32(UInt64 value)
 |          int ToInt32(Single value)
 |          int ToInt32(float value)
 |          int ToInt32(decimal value)
 |          int ToInt32(str value)
 |          int ToInt32(str value, IFormatProvider provider)
 |          int ToInt32(DateTime value)

>>> System.Convert.ToInt32("10")
10
>>> System.Convert.ToInt32("0x10")
Traceback (most recent call last):
  File , line 0, in <stdin>##26
  File , line 0, in ToInt32##25
  File mscorlib, line unknown, in ParseInt32
  File mscorlib, line unknown, in StringToNumber
SystemError: 入力文字列の形式が正しくありません。
>>> eval("10")
10
>>> eval("0x10")
16
>>> int("10")
10
>>> int("0x10")
Traceback (most recent call last):
  File , line 0, in <stdin>##33
ValueError: invalid integer number literal

pythonだと、evalを使えば、10/16進数の自動判定を行ってくれるので便利です。
.NETだと、標準で行ってくれないっぽいみたいですね。(IFormatProviderのカスタム実装が要るんでしょうねぇ)

それを踏まえてC#で、10/16進数の自動変換を行う方法を考えてみまして。

string s = "10"; // or "0x10"
int v = Int32.TryParse(s, out v) ? v : Convert.ToInt32(s, 16);

これでOKですかね?
(すぐに三項演算子に突っ走るのは、私の良くない癖です。ははは)