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

nie działa. Co ja robię źle?Jak przeanalizować wartości heksadecymalne w uint?

+1

jaki to jest język? Co powiesz na tag dla tego języka? –

+0

Wygląda na potężny jak C#, a jedna odpowiedź do tej pory potraktowała to w ten sposób, ale tak, tag byłby naprawdę dobrym pomysłem. –

Odpowiedz

102

Spróbuj

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

Coś, o czym należy pamiętać (chociaż może nie mieć zastosowania do tej konkretnej konwersji liczby całkowitej) ... jeśli dane wejściowe są złe, Convert.ToUInt32 może być wolniejsze o rząd wielkości niż UInt32.TryParse, np. Convert.ToDouble vs Double.TryParse: http://stackoverflow.com/questions/586436/double-tryparse-or-double-convert-what-is-faster-and-more-safe/586539#586539 Ponadto nie zawsze jest jasne, co konwertuje: http://stackoverflow.com/questions/586436/double-tryparse-or-double-convert-what-is-faster-and-more-safe/586460#586460 – Triynko

+1

Jak powiedział @Triynko, jest to błędny proces, ponieważ jest odpowiedzialny rzucać wyjątki. uint.TryParse byłby lepszy, ponieważ zwraca wartość logiczną wskazującą powodzenie lub niepowodzenie, zamiast rzucać wyjątek. – Zenexer

+0

To podejście z 'Convert.ToUInt32' obsłuży prefiks" 0x "jako część danych wejściowych. –

11

Albo jak

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

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

Można użyć przeciążony TryParse() który dodaje parametr NumberStyle na wezwanie TryParse który zapewnia parsowania wartości szesnastkowych. Użyj NumberStyles.HexNumber, który pozwala ci przekazać ciąg jako liczbę szesnastkową.

Uwaga: Problemem jest to, że NumberStyles.HexNumbernie wsparcia wartości analizowania z prefiksem (tj 0x, &H lub #.), Więc trzeba się rozebrać go przed próbą analizować wartość .

Zasadniczo chcesz to zrobić:

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); 

Zobacz ten artykuł na przykład jak używać wyliczenie NumberStyles: http://msdn.microsoft.com/en-us/library/zf50za27.aspx

+0

-1 nie działa: zobacz przykład MSDN link yo! "Nie powiodła się próba konwersji" 0x80C1 "." – peenut

+2

Masz rację! Aby zanalizować liczbę szesnastkową, taką jak "0x80C1", musielibyśmy usunąć część "0x". Zaktualizowałem próbkę kodu poprawnie. Dzięki. –

+0

-1 usunięte: zaktualizowany komentarz – peenut

4

Oto funkcja styl try-parse:

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; 
     } 
    } 
Powiązane problemy