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) 
    //... 

no funciona. ¿Qué estoy haciendo mal?¿Cómo se analizan los valores hexadecimales en un uint?

+1

¿qué idioma es este? ¿Qué tal una etiqueta para el idioma? –

+0

Parece poderosa como C#, y la respuesta hasta ahora lo ha tratado así, pero sí, una etiqueta habría sido una muy buena idea. –

Respuesta

102

Trate

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

Algo a tener en cuenta (aunque puede no aplicarse a esta conversión de entero particular) ... si la entrada es incorrecta, Convert.ToUInt32 podría ser órdenes de magnitud más lentas que UInt32.TryParse, como Convert.ToDouble versus Double.TryParse: http://stackoverflow.com/questions/586436/double-tryparse-or-double-convert-what-is-faster-and-more-safe/586539#586539 Además, no siempre está claro qué se está convirtiendo: http://stackoverflow.com/questions/586436/double-tryparse-or-double-convert-what-is-faster-and-more-safe/586460#586460 – Triynko

+1

Como dijo @Triynko, este es un proceso defectuoso, ya que es responsable lanzar excepciones. uint.TryParse sería preferible, ya que devuelve un valor booleano que indica éxito o falla, en lugar de arrojar una excepción. – Zenexer

+0

Este enfoque con 'Convert.ToUInt32' manejará el prefijo '0x' como parte de la entrada. –

11

O como

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

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

Puede utilizar un TryParse() sobrecargada que añade un parámetro NumberStyle a la llamada TryParse que proporciona el análisis de los valores hexadecimales. Use NumberStyles.HexNumber que le permite pasar la cadena como un número hexadecimal.

Nota: El problema con NumberStyles.HexNumber es que no valores de análisis de apoyo con un prefijo (es decir 0x, &H o #.), Así que hay que pelarlo antes de intentar analizar el valor .

Básicamente que haría esto:

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

Consulte este artículo para obtener un ejemplo de cómo utilizar el NumberStyles enumeración: http://msdn.microsoft.com/en-us/library/zf50za27.aspx

+0

-1 no funciona: consulte el ejemplo de MSDN que enlaza yo! "Falló la conversión intentada de '0x80C1'". – peenut

+2

¡Tienes razón! Para analizar un número hexadecimal como "0x80C1", tendrías que quitar la parte "0x". He actualizado mi muestra de código de manera adecuada. Gracias. –

+0

-1 eliminado: actualizó el comentario – peenut

4

Aquí es una función de estilo try-análisis sintáctico:

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; 
     } 
    } 
Cuestiones relacionadas