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

ne fonctionne pas. Qu'est-ce que je fais mal?Comment analyser les valeurs hexadécimales dans un Uint?

+1

quelle langue est-ce? Que diriez-vous d'un tag pour la langue? –

+0

Il semble puissant comme C#, et la seule réponse à ce jour l'a traité ainsi, mais oui, une étiquette aurait été une très bonne idée. –

Répondre

102

Essayez

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

Quelque chose à garder à l'esprit (bien que cela ne s'applique pas à cette conversion d'entier) ... si l'entrée est mauvaise, Convert.ToUInt32 pourrait être plus lent que UInt32.TryParse, comme Convert.ToDouble vs Double.TryParse: http://stackoverflow.com/questions/586436/double-tryparse-or-double-convert-what-is-faster-and-more-safe/586539#586539 Aussi, il n'est pas toujours clair ce qu'il convertit: http://stackoverflow.com/questions/586436/double-tryparse-or-double-convert-what-is-faster-and-more-safe/586460#586460 – Triynko

+1

Comme l'a dit @Triynko, il s'agit d'un processus défectueux, car il est responsable jeter des exceptions. uint.TryParse serait préférable, car il renvoie une valeur booléenne indiquant le succès ou l'échec, plutôt que de lancer une exception. – Zenexer

+0

Cette approche avec 'Convert.ToUInt32' gèrera le préfixe '0x' comme partie de l'entrée. –

11

Ou comme

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

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

Vous pouvez utiliser un TryParse() surchargé qui ajoute un paramètre NumberStyle à l'appel TryParse qui fournit l'analyse des valeurs hexadécimaux. Utilisez NumberStyles.HexNumber qui vous permet de passer la chaîne comme un nombre hexadécimal.

Remarque: Le problème avec NumberStyles.HexNumber est qu'il ne pas les valeurs d'analyse syntaxique de support avec un préfixe (c.-à-0x, &H ou #.), Donc vous devez dépouiller avant de tenter d'analyser la valeur .

Fondamentalement, vous feriez ceci:

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

Voir cet article pour un exemple de la façon d'utiliser l'énumération NumberStyles: http://msdn.microsoft.com/en-us/library/zf50za27.aspx

+0

-1 ne fonctionne pas: voir l'exemple de MSDN auquel vous associez yo! "La tentative de conversion de '0x80C1' a échoué." – peenut

+2

Vous avez raison! Pour analyser un nombre hexadécimal comme "0x80C1", vous devez supprimer la partie "0x". J'ai mis à jour mon exemple de code de manière appropriée. Merci. –

+0

-1 supprimé: vous avez mis à jour le commentaire – peenut

4

est ici fonction de style 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; 
     } 
    } 
Questions connexes