2011-03-19 21 views
8

Tengo el número de flotación en la cadena. hay un problema El número usa "." no "," como punto decimal.Parse cadena para flotar número C#

Este código no funciona:

MyNumber = float.Parse("123.5"); 

sé que puedo usar cuerdas reemplazar la función de "reparar" esta cadena antes de análisis.

MyNumber = float.Parse("123.5".Replace('.',','); 

Pero ¿hay alguna otra manera de hacerlo?

Respuesta

6

Para agregar a la pregunta de Steven, en lugar de discutir de manera diferente, lo importante es por qué el separador decimal es ..

Si es porque la fuente está en un formato legible por computadora donde el separador de punto decimal se especifica como parte de la especificación del documento, entonces iría exactamente como lo hace Steven al usar CultureInfo.InvariantCulture.

Si se trata de una entrada humana en una configuración regional particular, entonces conviene que coincida con esa configuración regional por el CultureInfo apropiado para esa configuración; de lo contrario, si el software se utiliza con una configuración regional diferente, tendría exactamente el problema opuesto. En general, le conviene configurar el hilo CurrentCulture para que coincida con este (CurrentCulture para los formatos, CurrentUICulture para los idiomas). Si ha hecho esto, no es necesario que pase una cultura en absoluto, ya que el formulario float.Parse(string) usa esa cultura; sin embargo, es posible que desee usar float.Parse(string, CurrentCulture) para indicar explícitamente que esto es lo que está haciendo (y para cerrar un análisis de software que se queja cuando no es específico de esta manera).

Lo que se pone realmente complicado es aceptar períodos y coma, sobre todo porque muchas culturas que usan el período como separador decimal usan la coma como separador de miles y, en última instancia, es imposible garantizar un análisis inequívoco. Sin embargo, suponiendo que el problema de los miles no le afecta, entonces el código que dio en su pregunta es el enfoque, aunque recomendaría hacer lo contrario (reemplazar la coma por punto) y luego analizar con la cultura invariante, ya que eso elimina cualquier otras complicaciones causadas por aún más cambios en la cultura.

20

El uso del reemplazo de cadenas es muy frágil y dará lugar a errores sutiles. Especifique el IFormatProvider en su lugar. Por ejemplo:

MyNumber = float.Parse("123.5", CultureInfo.InvariantCulture); 

o puede especificar el NumberFormatInfo utilizando otro sobrecarga de Parse.

+2

¿Por qué 'nl-NL' y no' CultureInfo.InvariantCulture'? –

+2

@Jonas: 'nl-NL' era solo un ejemplo, pero después de volver a leer la pregunta, noté que' CultureInfo.CurrentCulture' del OP tiene ',' como separador decimal. La cultura holandesa (nl) en realidad usa ',' como separador decimal, y por lo tanto * no * funcionará. Entonces, el truco es establecer una cultura que use '.' como separador decimal como lo hace 'en-US' y la cultura invariante. Gracias por mencionar esto. – Steven

1

Depende de la cultura actual de la cultura de hilos actualmente ejecutada.

float.Parse("123,5", system.threading.thread.currentthread.currentculture); 

float.Parse("123.5", system.threading.thread.currentthread.currentculture); 

SI usted no desea estrictamente culturespecific continuación

float.Parse("123.5", CultureInfo.InvariantCulture);