2008-09-19 10 views
61
uint color; 
bool parsedhex = uint.TryParse(TextBox1.Text, out color); 
//where Text is of the form 0xFF0000 
if(parsedhex) 
    //... 

は機能しません。何が間違っているのですか?16進数値を解析してuintに変換する方法は?

+1

これはどの言語ですか?言語のタグはどうですか? –

+0

これはC#のように強烈に見えますが、これまでの回答ではこれを扱っていますが、タグは本当に良いアイデアでした。 –

答えて

102

は、あなたが16進値の解析を提供TryParseコールにNumberStyleパラメータを追加し、オーバーロードTryParse()を使用することができます

Convert.ToUInt32(hex, 16) //Using ToUInt32 not ToUInt64, as per OP comment 
+5

何かを覚えておいてください(この特定の整数の変換には当てはまらないかもしれませんが...)...入力が悪い場合、Convert.ToDouble対Double.TryParseのように、Convert.ToUInt32はUInt32.TryParseよりも遅くなります: http://stackoverflow.com/questions/586436/double-tryparse-or-double-convert-what-is-faster-and-more-safe/586539#586539また、それはいつもそれが何を変換しているのか分からない:http:///tackoverflow.com/questions/586436/double-tryparse-or-double-convert-what-is-faster-and-more-safe/586460#586460 – Triynko

+1

@Triynkoは言ったように、これは責任があるので、これはプロセスが間違っています例外をスローする例外をスローするのではなく、成功または失敗を示すブール値を返すので、uint.TryParseが望ましいでしょう。 – Zenexer

+0

このConvert.ToUInt32でのアプローチは、入力の一部としてプレフィックス '0x'を扱います。 –

11

など

string hexNum = "0xFFFF"; 
string hexNumWithoutPrefix = hexNum.Substring(2); 

uint i; 
bool success = uint.TryParse(hexNumWithoutPrefix, System.Globalization.NumberStyles.HexNumber, null, out i); 
39

を試してみてください。 NumberStyles.HexNumberを使用すると、文字列を16進数で渡すことができます。

NumberStyles.HexNumberの問題は、それサポートがプレフィックス(。すなわち0x&H、または#)で値を解析していないということですので、あなたが値を解析しようとする前にそれを取り除くために持っています。

基本的にあなたがこれを行うだろう:

uint color; 
var hex = TextBox1.Text; 

if (hex.StartsWith("0x", StringComparison.CurrentCultureIgnoreCase) || 
    hex.StartsWith("&H", StringComparison.CurrentCultureIgnoreCase)) 
{ 
    hex = hex.Substring(2); 
} 

bool parsedSuccessfully = uint.TryParse(hex, 
     NumberStyles.HexNumber, 
     CultureInfo.CurrentCulture, 
     out color); 

NumberStyles列挙型を使用する方法の例については、この記事を参照してください:ここでhttp://msdn.microsoft.com/en-us/library/zf50za27.aspx

+0

-1は動作しません。MSDNの例を参照してください。 "'0x80C1'の変換に失敗しました。" – peenut

+2

あなたは正しいです! "0x80C1"のような16進数を解析するには、 "0x"部分を削除する必要があります。コードサンプルを適切に更新しました。ありがとう。 –

+0

-1削除:更新されたコメント – peenut

4

は、try-解析形式の関数である:

private static bool TryParseHex(string hex, out UInt32 result) 
    { 
     result = 0; 

     if (hex == null) 
     { 
      return false; 
     } 

     try 
     { 
      result = Convert.ToUInt32(hex, 16); 

      return true; 
     } 
     catch (Exception exception) 
     { 
      return false; 
     } 
    }