Domanda

Il codice viene compilato in VS2008 mira .NET3.5. Questo non è riproducibile sul mio sistema. Ho il sospetto che un qualche tipo di impostazione localizzazione è in gioco, ma non so molto su questo.

Tutti gli altri numeri validi sembrano funzionare bene. Il problema è illustrato con questo codice (che causa la stessa eccezione ma non è il codice di produzione):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "";
            do
            {
                str = Console.ReadLine();
                Console.WriteLine("\t\"{0}\"", Convert.ToDouble(str));
            }
            while (str != null);
        }
    }
}

Nella riga di comando, di ingresso di "0" si blocca l'applicazione su almeno un sistema che abbia mai incontrato.

Stack trace dal PC dell'utente:

System.FormatException: Input string was not in a correct format.
   at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   at System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt)
   at System.Double.Parse(String s, NumberStyles style, NumberFormatInfo info)
   at System.Convert.ToDouble(String value)
È stato utile?

Soluzione

Mi ricordo di questo problema da una domanda un po 'indietro. I metodi Parse () sono influenzati dalle override utente nel Pannello di controllo applet + Paese e lingua. IIRC, è particolarmente sensibile alla impostazione "Negativo segno simbolo". Chiedi al tuo all'utente di correggere le impostazioni lì.

La domanda di riferimento è qui .

Altri suggerimenti

Se il problema è legato alla cultura corrente, provare la conversione in doppio usando cultura invarianti:

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

E 'abbastanza facile dimostrare che non è a causa del codice (o il CultureInfo), posso dimostrare che per tutte le culture in .NET, una stringa "0" possono essere convertiti per raddoppiare correttamente.

string inputNumber = "0";
foreach (var culture in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
   try
   {
       double d = Convert.ToDouble(inputNumber, culture);
   }
   catch
   {
      Console.WriteLine(culture.Name);
   }
}
Console.WriteLine("end");
Console.Read();

E 'uscite nient'altro che una "fine".

Si potrebbe essere correlato alle impostazioni cultura. Per quanto ne so in alcune impostazioni di lingua si dovrebbe digitare 0.0 per essere in grado di convertire in doppia

Non credo che va in crash quando si 0 di ingresso.

Sarà, ovviamente, in crash quando si immette qualsiasi cosa che non è un numero. Ciò significa che va in crash se si immette una stringa vuota (in altre parole, basta premere Invio). Immagino che questo è ciò che si sta verificando.

È il codice avrebbe funzionato (solo per i numeri) se si cambia in questo modo:

string str = "";
do
{
    str = Console.ReadLine();
    if(!string.IsNullOrEmpty(str))
        Console.WriteLine("\t\"{0}\"", Convert.ToDouble(str));
}
while (str != "");

L'istanza CurrentCulture CultureInfo è probabilmente la colpa. Convert.ToDouble chiamata, dopo tutto, semplicemente restituisce il risultato di Double.Parse . Questo, come documentato, utilizza NumberFormatInfo della cultura correnti per le cose capire.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top