Quiero analizar una cadena como "3.5"
un doble. Sin embargo,
double.Parse("3.5")
rinde 35 y
double.Parse("3.5", System.Globalization.NumberStyles.AllowDecimalPoint)
lanza a FormatException
.
Ahora la configuración regional de mi computadora está configurada en alemán, en donde se usa una coma como separador decimal. Puede que tenga que hacer algo con eso y double.Parse()
esperar "3,5"
como entrada, pero no estoy seguro.
¿Cómo puedo analizar una cadena que contiene un número decimal que puede o no formatearse como se especifica en mi ubicación actual?
Respuestas:
fuente
XmlConvert
clase ... ¿Tienes alguna idea de si esto es mejor, peor y / o diferente que usarCultureInfo.InvariantCulture
?XmlConvert
realidad no está destinado a usarse para analizar un solo valor doble en el código. Prefiero usardouble.Parse
oConvert.ToDouble
eso hace que mi intención sea obvia.Normalmente uso una función multicultural para analizar la entrada del usuario, principalmente porque si alguien está acostumbrado al teclado numérico y está usando una cultura que usa una coma como separador decimal, esa persona usará el punto del teclado numérico en lugar de una coma.
Sin embargo, ten cuidado, los comentarios de @nikie son ciertos. En mi defensa, uso esta función en un entorno controlado donde sé que la cultura puede ser en-US, en-CA o fr-CA. Uso esta función porque en francés, usamos la coma como separador decimal, pero cualquiera que haya trabajado en finanzas siempre usará el separador decimal en el teclado numérico, pero este es un punto, no una coma. Entonces, incluso en la cultura fr-CA, necesito analizar un número que tendrá un punto como separador decimal.
fuente
No pude escribir un comentario, así que escribo aquí:
double.Parse ("3.5", CultureInfo.InvariantCulture) no es una buena idea, porque en Canadá escribimos 3.5 en lugar de 3.5 y esta función nos da 35 como resultado.
Probé ambos en mi computadora:
Esta es una forma correcta que mencionó Pierre-Alain Vigeant
fuente
Reemplace la coma con un punto antes de analizar. Útil en países con una coma como separador decimal. Piense en limitar la entrada del usuario (si es necesario) a una coma o punto.
fuente
El truco es utilizar una cultura invariante, analizar el punto en todas las culturas.
fuente
Mire, cada respuesta anterior que propone escribir un reemplazo de cadena por una cadena constante solo puede ser incorrecta. ¿Por qué? ¡Porque no respetas la configuración regional de Windows! Windows garantiza al usuario la libertad de establecer el carácter separador que desee. Él / ella puede abrir el panel de control, ir al panel de región, hacer clic en avanzado y cambiar el personaje en cualquier momento. Incluso durante la ejecución de su programa. Piensa en esto. Una buena solución debe ser consciente de esto.
Entonces, primero tendrá que preguntarse, de dónde proviene este número, que desea analizar. Si proviene de la entrada en .NET Framework, no hay problema, porque estará en el mismo formato. Pero tal vez provenía de afuera, tal vez de un servidor externo, tal vez de un DB antiguo que solo admite propiedades de cadena. Allí, el administrador de db debería haber dado una regla en qué formato se deben almacenar los números. Si sabe, por ejemplo, que será una base de datos estadounidense con formato estadounidense, puede usar este código:
Esto funcionará bien en cualquier parte del mundo. Y no use 'Convert.ToXxxx'. La clase 'Convertir' se considera solo como una base para conversiones en cualquier dirección. Además: también puede utilizar el mecanismo similar para DateTimes.
fuente
fuente
Mis dos centavos sobre este tema, tratando de proporcionar un método genérico de doble conversión:
Funciona como se espera con:
Ninguna conversión predeterminado se implementa, por lo que sería un error intentar analizar
1.3,14
,1,3.14
o casos similares.fuente
El siguiente código hace el trabajo en cualquier escenario. Está un poco analizando.
fuente
Creo que la conversión 100% correcta no es posible si el valor proviene de una entrada del usuario. por ejemplo, si el valor es 123.456, puede ser una agrupación o puede ser un punto decimal. Si realmente necesita el 100%, debe describir su formato y lanzar una excepción si no es correcto.
Pero mejoré el código de JanW, por lo que avanzamos un poco más al 100%. La idea detrás es que, si el último separador es un groupSeperator, sería más un tipo entero que un doble.
El código agregado está en el primero si es de GetDouble .
fuente
fuente
En lugar de tener que especificar una configuración regional en todos los análisis, prefiero establecer una configuración regional amplia de la aplicación, aunque si los formatos de cadena no son consistentes en la aplicación, esto podría no funcionar.
Definir esto al comienzo de su aplicación hará que todos los análisis dobles esperen una coma como delimitador decimal. Puede establecer una configuración regional adecuada para que el separador decimal y de miles se ajuste a las cadenas que está analizando.
fuente
Es difícil sin especificar qué separador decimal buscar, pero si lo hace, esto es lo que estoy usando:
Esto debería funcionar con cualquier cultura. No puede analizar correctamente las cadenas que tienen más de un separador decimal, a diferencia de las implementaciones que reemplazan en lugar de intercambiar.
fuente
También mejoré el código de @JanW ...
Lo necesito para formatear resultados de instrumentos médicos, y también envían "> 1000", "23.3e02", "350E-02" y "NEGATIVO".
fuente
fuente
Creo que es la mejor respuesta:
fuente
Lo siguiente es menos eficiente, pero uso esta lógica. Esto es válido solo si tiene dos dígitos después del punto decimal.
fuente
Multiplica el número y luego divídelo por lo que multiplicaste antes.
Por ejemplo,
fuente