Versión resumida y dulce:decimal.TryParse() cae líder "1"
En una máquina de alrededor de un centenar de máquinas de prueba decimal.TryParse() es la conversión de "1,01" a 0,01
Bien, esto va a sonar loco, pero tengan paciencia ...
Tenemos una aplicación cliente que se comunica con un servicio web a través de JSON, y ese servicio devuelve un valor decimal como cadena, así que lo almacenamos como una cadena en nuestro modelo de objeto:
[DataMember(Name = "value")]
public string Value { get; set; }
Cuando mostramos ese valor en la pantalla, se formatea a un número específico de decimales. Entonces el proceso que usamos es string -> decimal luego decimal -> string.
La aplicación se encuentra actualmente en pruebas finales y se está ejecutando en más de 100 máquinas, donde todo funciona bien. Sin embargo, en una máquina si el valor decimal tiene un '1' inicial, entonces se reemplaza por un cero. He añadido el registro sencillo para el código por lo que se ve así:
Log("Original string value: {0}", value);
decimal val;
if (decimal.TryParse(value, out val))
{
Log("Parsed decimal value: {0}", val);
string output = val.ToString(format, CultureInfo.InvariantCulture.NumberFormat);
Log("Formatted string value: {0}", output);
return output;
}
En mi máquina - cualquier cualquier otro equipo cliente - la salida del archivo de registro es:
- valor de cadena original: 1.010000
Analizada- valor decimal: 1,010000
- valor de cadena con formato: 1,01
En la máquina defectuosa la salida es:
- original valor de cadena: 1,010000
- valor decimal procesado: 0,010000
- valor de cadena con formato: 0,01
Por lo tanto, parecería que el método decimal.TryParse tiene la culpa.
cosas que hemos probado:
- desinstalar y reinstalar la aplicación cliente
- desinstalación y reinstalación de .NET 3.5 SP1
- Comparando la configuración regional de la máquina defectuosa para los números (utilizando Inglés (Reino Unido)) a los de una máquina en funcionamiento - sin diferencias.
¿Alguien ha visto algo como esto o tiene alguna sugerencia? Rápidamente me estoy quedando sin ideas ...
Mientras estaba escribiendo esto un poco más de información se produjo en: Pasar un valor de cadena de "10000" para convertir.ToInt32() devuelve 0, por lo que también parece caer las principales 1.
Otras pruebas basadas en los comentarios:
- 1,01 -> 0,01
- 111.01 -> 11,01
- 123.01 -> 23,01
- 231,01 -> 231,01
- 01,01 -> 1,01
Parece que solo afecta a 1s y solo si son el primer caracter de la cadena. Muy extraño, pero al menos es consistente.
extraño. ¿Qué sucede con otros dígitos como "123" o "321"? –
¿Mala RAM en la máquina? ¿Has intentado ejecutar algo como memtest86? –
Esta es una muy mala idea, pero si pre-almohadilla con un cero ...? – spender