2010-01-12 8 views
10

Hola a todos, estoy desarrollando un software que usa precisión numérica, pero tengo este problema, sucede que cuando tomo una cadena para convertirla al doble, me envía a una cultura diferente.Convert.ToDouble ("4089.90") genera 40.899,00 ¿por qué?

Por ejemplo yo uso

Convert.ToDouble("4089.90"); // it outputs 40.899,00 

es extraño porque en mi equipo que funciona bien, pero en el PC del cliente (con la misma cultura en la configuración regional) me muestra la última salida. Sé que puedo fijarla con

Convert.ToDouble("4089.90", System.Globalization.CultureInfo.InvariantCulture); 

pero hay una gran cantidad de código en el programa usando "Convert.ToDouble" y no me gustaría cambiar todos de la misma, por otro lado quiero entender por qué sucede esto.

Gracias de antemano.

+0

¿Qué sistema operativo, etc. para ambas computadoras? – GalacticCowboy

+0

El mío es Windows Vista y las máquinas cliente son XP. –

+0

Esto es una especie de duplicado de todas las demás respuestas, por lo que no estoy publicando como mío. Pero si se proporciona 'InvariantCulture' al método' Convert' corrige el problema, claramente es un problema que involucra culturas. Debe agregar el registro a su programa que genera información de cultivo, y solicite ese registro a los usuarios que informan el problema. Luego puedes volver a ellos y decir: "es porque tienes estas configuraciones en tu computadora: * blah blah *". – jdmichal

Respuesta

13

Puede establecer la cultura de su hilo con:

Thread.CurrentThread.CurrentCulture = 
     System.Globalization.CultureInfo.InvariantCulture; 
+1

+1, ya que esto resuelve el problema, "pero hay un montón de código en el programa que usa" Convert.ToDouble "y no me gustaría cambiarlo por completo". – jdmichal

+0

Como dije "hay un montón de código en el programa que usa" Convert.ToDouble "y no me gustaría cambiarlo todo". Thnx jdmichael. –

1

No conozco ni C# ni asp.net, pero creo que el problema es este: está realizando la operación en una cultura donde el punto . es el separador de miles y no el separador decimal. El resultado que cita es la prueba: 40.899,00.

¿En qué cultura/lugar trabajas?

+0

La configuración de mi cultura es de Honduras, donde el separador de mil es una coma y el decimal es un punto. Lo raro, como he citado, es que las máquinas cliente usan la misma configuración cultural. –

+0

Pero si la configuración cultural es hondureña, ¿cómo puede la salida ser 40.899,00? –

+0

Esa es mi pregunta, he estado buscando en la web y el msdn dice "Debido a las diferencias en la precisión, el valor de retorno puede no ser exactamente igual al valor, y para valores de valor que son menos del doble ...: : .Epsilon, el valor de retorno también puede variar según la arquitectura del procesador ". ¿Qué puedo decir? Estoy confundido. –

2

No dice dónde está basado, pero el resultado es coherente con la cultura actual que es uno que tiene "." como el separador de miles y una coma decimal en lugar de un punto decimal.

Sin embargo, afirma que la cultura es la misma, lo que contradice. ¿Usted o el cliente han cambiado (o personalizado) los "Estándares y formatos" en las Opciones regionales y de idioma? Si la configuración se ha personalizado, todavía se leerá como "English (United Kingdom)" (o donde sea) pero producirá resultados diferentes a los predeterminados.

+0

La configuración de mi cultura muestra una coma para el separador de miles y un punto para el decimal. Mi PC funciona bien en lugar de un cliente que usa un sistema operativo diferente al mío (Vista para mí, XP para el cliente) que muestra otro resultado. –

+0

@nmiranda - en ese caso, el cliente debe haber cambiado su configuración a lo largo de las líneas que describo. – ChrisF

+0

Anécdota: He tenido problemas similares a esto antes. Me gusta el (viejo) formato de hora alemán de 24 horas separado por un punto. El programa que analizaba mi certificado de seguridad HTTPS no lo hizo :) Por lo tanto, no es suficiente simplemente examinar el nombre de la cultura; El diablo está en los detalles. – jdmichal

0

Cultura podría basarse en donde la aplicación ASP.Net se está ejecutando, y no el PC cliente que ejecuta el navegador. Si bien su computadora de escritorio puede tener configuraciones de cultivo similares, el servidor puede ser diferente.

+0

El servidor tiene la misma configuración cultural. –

0

Es su computadora que no está dando la respuesta correcta, no la de ellos. Su cultura establece que "4089.90" es lo mismo que 4089900, ya que el punto (.) Se usa para separar miles (y por lo tanto debe haber tres números después del punto).

Parece que desea utilizar el punto como un separador de decimales, a diferencia de su configuración cultural; para que tenga para usar System.Globalization.CultureInfo.InvariantCulture en su programa. Lo siento.

0

En realidad es muy raro este comportamiento causar todas las máquinas tienen la misma configuración de la cultura, sin embargo, creo que la mejor solución sería modificar el web.config como esto:

configuration> 
    <system.web> 
    <globalization culture = "es-HN" /> 
    </system.web> 
</configuration 

y aplicar la configuración de toda la aplicación.

Gracias a todos por su ayuda.

0

Aunque dkantowitz's solution puede ser el más fácil para una solución rápida, realmente debería considerar pasar el argumento IFormatProvider (como en su segundo fragmento) por las razones indicadas en http://msdn.microsoft.com/en-us/library/ms182190(VS.80).aspx.

Este tipo de problemas se pueden evitar fácilmente activando el Análisis de código estático desde el principio. Si la SKU de su Visual Studio no ofrece esta característica, puede pasar al FxCop, una versión gratuita.

Volviendo a la solución propuesta, debe tener en cuenta que cualquier código puede cambiar CurrentCulture del hilo en cualquier momento y, dependiendo del tamaño de su base de código y de la cantidad de personas que trabajan en él, puede entrar en la situación de un parte difernte del código configurando Thread.CurrentCulture a un valor diferente para arreglar su problema mientras desordena el tuyo.

Cuestiones relacionadas