breve e versione dolce:decimal.TryParse() scende leader "1"
Su una macchina fuori di circa un centinaio di macchine di prova decimal.TryParse() è la conversione "1,01" per 0,01
Ok, sembrerà pazzesco, ma portami con me ...
Abbiamo un'applicazione client che comunica con un servizio web tramite JSON e quel servizio restituisce un valore decimale come una stringa così lo memorizziamo come una stringa nel nostro modello oggetto:
[DataMember(Name = "value")]
public string Value { get; set; }
Quando viene visualizzato quel valore sullo schermo, viene formattato con un numero specifico di posizioni decimali. Quindi il processo che usiamo è stringa -> decimale poi decimale -> stringa.
L'applicazione è attualmente sottoposta a test finali ed è in esecuzione su oltre 100 macchine, dove tutto funziona correttamente. Tuttavia su una macchina se il valore decimale ha un "1" iniziale allora viene sostituito da uno zero. Ho aggiunto semplice registrazione per il codice in modo che assomiglia a questo:
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;
}
Sulla mia macchina - qualsiasi ogni altra macchina client - l'uscita file di log è:
- valore stringa originale: 1,010 mila
- Parsed valore decimale: 1,010000
- formattato valore stringa: 1,01
Sulla macchina difettosa l'output è:
- valore stringa originale: 1,010000
- analizzato valore decimale: 0,010000
- valore stringa formattata: 0,01
Così sembrerebbe che il metodo decimal.TryParse sia in errore.
cose che abbiamo provato:
- disinstallare e reinstallare l'applicazione client
- disinstallare e reinstallare .NET 3.5 SP1
- Confrontando impostazioni internazionali della macchina difettosa per i numeri (con English (United Kingdom)) a quelli di una macchina funzionante - nessuna differenza.
Qualcuno ha visto qualcosa di simile o ha qualche suggerimento? Sto rapidamente a corto di idee ...
Mentre stavo scrivendo questo un po 'di informazioni è venuto in: Passare un valore stringa di "10000" per convertire.ToInt32() restituisce 0, in modo che sembra anche cadere le principali 1.
Ulteriori prove basate su osservazioni:
- 1,01 -> 0.01
- 111.01 -> 11.01
- 123.01 -> 23,01
- 231,01 -> 231,01
- 01,01 -> 1,01
Quindi sembrerebbe che riguarda solo 1s e solo se sono il primo carattere della stringa. Molto strano, ma almeno è coerente.
Strano. Cosa succede con altre cifre come "123" o "321"? –
RAM danneggiata nella macchina? Hai provato a eseguire qualcosa come memtest86? –
Questa è una pessima idea, ma se pre-pad con uno zero ...? – spender