Qual è il modo migliore per prendere una stringa che può essere vuota o contenere "1.2" ad esempio e convertirla in un numero intero? int.TryParse
non riesce, naturalmente, e non voglio utilizzare float.TryParse
e quindi convertire in int
.C# Conversione di una stringa contenente un punto mobile in un numero intero
risposta
Soluzione 1: Convert.ToDouble
(cultura-dipendente)
Si può utilizzare Convert.ToDouble
. Ma attenzione! La soluzione seguente funzionerà solo quando il separatore di numeri nell'impostazione della cultura corrente è un carattere di periodo.
var a = (int)Convert.ToDouble("1.2");
Soluzione 2: Convert.ToDouble
(indipendente dalla cultura)
È preferibile utilizzare IFormatProvider
e convertire il numero in modo indipendente dalle impostazioni cultura correnti:
var a = (int)Convert.ToDouble("1.2", CultureInfo.InvariantCulture.NumberFormat);
Soluzione 3: Parse & Split
Un altro modo per eseguire questa operazione è utilizzare Dividi su stringa analizzata:
var a = int.Parse("1.2".Split('.')[0]);
Oppure:
var a = int.Parse("1.2".Split('.').First());
Note
- Se si desidera gestire stringhe vuote e nulli, scrivere un metodo e aggiungere stringa.
IsNullOrEmpty
condizione. - Per ottenere il separatore decimale per l'impostazione cultura corrente, è possibile utilizzare la proprietà
NumberFormatInfo.NumberDecimalSeparator
. - Si dovrebbe inoltre tenere d'occhio rounding per evitare traps.
- Seleziona casting, classe
Parse
,TryParse
oConvert
saggiamente. Per saperne di più:
+1. Soprattutto per dire che 'Convert.ToDouble' usa il delimitatore decimale delle impostazioni della cultura del filo (per impostazione predefinita le impostazioni regionali di Windows) e può essere una virgola. Puoi forzarlo a usare un punto passando 'CultureInfo.InvariantCulture.NumberFormat' – MarkJ
Forse si può provare a eliminare tutto dopo il virgola mobile utilizzando le funzioni di stringa e quindi convertire in int. Ma seriamente non penso sia meglio che convertire in float e poi in int.
Non so cosa c'è di sbagliato con l'analisi ad un float
e la conversione a un int
. Dubito che qualsiasi altro modo sarebbe più efficiente, ma qui è un tentativo:
//allows empty strings and floating point values
int ParseInt(string s, bool alwaysRoundDown = false)
{
//converts null/empty strings to zero
if (string.IsNullOrEmpty(s)) return 0;
if (!s.Contains(".")) return int.Parse(s);
string parts = s.Split(".");
int i = int.Parse(parts[0]);
if (alwaysRoundDown || parts.Length==1) return i;
int digitAfterPoint = int.Parse(parts[1][0]);
return (digitAfterPoint < 5) ? i : i+1;
}
Al fine di globalizzare il codice che avrebbe bisogno di sostituire "."
con System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator
.
Penso che un altro modo per farlo sarebbe suddividere la stringa in pezzi prendendo il decimale (.) Come delimitatore e quindi analizzando il numero intero. Naturalmente, devo ancora chiederti se la stringa potrebbe contenere valori come "37.56 miles in 32.65 seconds"
valori di tipo.
Considerando ci sarà solo un valore (stringa o numero) nella stringa, mi viene in mente qualcosa nella riga seguente:
public int64 GetInt64(string input)
{
if (string.IsNullOrEmpty(input)) return 0;
// Split string on decimal (.)
// ... This will separate all the digits.
//
string[] words = input.Split('.');
return int.Parse(words[0]);
}
Forse non è necessario il ritorno int64 quando si esegue un analisi int32. – btlog
int a = (int)Math.Round(float.Parse("0.9"));
È necessario arrotondare per primo a meno che non si desidera 0.9 f convertito in 0 anziché 1.
È possibile utilizzare la libreria di runtime di Visual Basic per eseguire questa operazione da C#.
È necessario aggiungere un riferimento all'assembly Microsoft.VisualBasic.dll alla soluzione.
Poi il seguente codice farà la vostra conversione:
using VB = Microsoft.VisualBasic.CompilerServices;
class Program
{
static void Main(string[] args)
{
int i = VB.Conversions.ToInteger("1.2");
}
}
Ho avuto questo stesso problema e finito per usare un ibrido di Marco e Dariusz ':
if (num == "")
{
num = "0.00";
}
var num1 = (float)Convert.ToDouble(num);
btw, 1.2 non è un numero intero . – Zaki
Appart analizzandolo su di un float e quindi eseguendolo, non vedo come si possa fare ... – Philippe
'(int) float.Parse (" 1.2 ")' - non è troppo lavoro. Ruby fa questo però - '" 1.234 ".to_i' produce 1 – Gishu