Nel tuo profilo, si dice che vieni dalla Corea del Sud. Ecco perché presumo che la tua cultura attuale sia ko-KR
. (E tu pure said.)
Ed è NumberDecimalSeparator
è .
ma è NumberGroupSeparator
è ,
vostri Convert.ToDouble
opere ed assume il vostro ,
è un separatore migliaia, non separatore decimale. Ecco perché il tuo dthou
sarà 1000
non 1
.
Convert.ToInt32(string)
utilizza Int32.Parse(string, CultureInfo.CurrentCulture)
esplicitamente e questo metodo implemented come;
public static int Parse(String s, IFormatProvider provider)
{
return Number.ParseInt32(s, NumberStyles.Integer, NumberFormatInfo.GetInstance(provider));
}
Come si può vedere questo metodo utilizza NumberStyles.Integer
come predefinito. Ed è per questo che la tua stringa può essere analizzata correttamente solo contando uno di questi;
- spazi bianchi
- Trailing spazio bianco
- Leading segno (positivo o negativo)
E dal momento che la stringa ha separatore delle migliaia o separatore decimale (questo dipende da quale quello utilizzato per) questo metodo genera un'eccezione.
Invece di che, si può utilizzare Int32.Parse(String, NumberStyles, IFormatProvider)
overload cui è possibile specificare il vostro NumberStyles
come NumberStyles.AllowDecimalPoint
o NumberStyles.AllowThousands
A titolo di esempio;
string str = "1,000";
int ithou = Int32.Parse(str, NumberStyles.AllowThousands,
new CultureInfo("ko-KR"));
Console.WriteLine(ithou); // Prints 1000
Se si desidera ottenere 1
di conseguenza, è possibile utilizzare CultureInfo.Clone
method per la vostra cultura e impostare è NumberDecimalSeparator
e NumberGroupSeparator
immobili come;
string str = "1,000";
CultureInfo c = (CultureInfo)CultureInfo.GetCultureInfo("ko-KR").Clone();
c.NumberFormat.NumberDecimalSeparator = ",";
c.NumberFormat.NumberGroupSeparator = ".";
int dthou = Int32.Parse(str, NumberStyles.AllowDecimalPoint, c);
Console.WriteLine(dthou); // Prints 1
non credo che sia un problema culturale. È la gestione incoerente dello della stringa formattata. ToDouble accetta le stringhe con la virgola, ma non lo è per ToInt32 . È come tornare alla domanda originale di nuovo, ma non è possibile implementare ToInt32 per accettare la virgola, proprio come la funzione ToDouble ?
Oh, mio caro amico, che si sta ancora pensando sbagliato ..
Tutto è un problema culturale nel tuo caso. Non esiste una cosa del genere "Convert.ToDouble()
accetta stringhe con la virgola, ma Convert.ToInt32()
non corrisponde a".
Guardiamo ancora una volta come questi metodi sono implementati.
Convert.ToDouble(string)
utilizza Double.Parse(value, CultureInfo.CurrentCulture)
esplicitamente ed è uguale a implemented;
public static double Parse(String s, IFormatProvider provider)
{
return Parse(s, NumberStyles.Float| NumberStyles.AllowThousands, NumberFormatInfo.GetInstance(provider));
}
Con questo NumberStyles.Float| NumberStyles.AllowThousands
, è possibile utilizzare sia il punto decimale o separatore delle migliaia nel codice, ma ,
è di vostra cultura NumberGroupSeparator
non NumberDecimalSeparator
. Ecco perché la stringa verrà analizzata come un migliaio di seperetori. Non esiste una cosa del genere Convert.ToDouble utilizza una stringa con la virgola. Può essere utilizzato il NumberDecimalSeparator
o NumberGroupSeparator
della cultura corrente a seconda del carattere della stringa. Se entrambi fossero uguali, NumberDecimalSeparator
sarà dominante e verrà utilizzato.
Convert.ToInt32(string)
utilizza Int32.Parse(string, CultureInfo.CurrentCulture)
esplicitamente ed è implemented simili;
public static int Parse(String s, IFormatProvider provider)
{
return Number.ParseInt32(s, NumberStyles.Integer, NumberFormatInfo.GetInstance(provider));
}
come ho detto prima, NumberStyles.Integer
permette tre cose per la stringa; condurre lo spazio bianco, trascinare lo spazio bianco e condurre un segno positivo o negativo. Non può essere analizzato se la stringa ha separatore decimale o separatore di migliaia , indipendentemente dalla virgola o dal punto.
ma non poteva essere attuato ToInt32 ad accettare il proprio come funzione ToDouble virgola?
Te l'ho già detto. Convert.ToInt32
non ha un sovraccarico richiede NumberStyles
come parametro. È possibile utilizzare Int32.Parse(String, NumberStyles, IFormatProvider)
overload che è possibile specificare l'enumerazione NumberStyles
per l'analisi del separatore decimale o del separatore delle migliaia.
Qual è la tua cultura attuale? –
Questo sembra un problema di cultura. – Flater
CultureInfo.CurrentCulture.Name mi dice "ko-KR" – Keugyeol