2010-08-03 2 views
13

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

+0

btw, 1.2 non è un numero intero . – Zaki

+4

Appart analizzandolo su di un float e quindi eseguendolo, non vedo come si possa fare ... – Philippe

+1

'(int) float.Parse (" 1.2 ")' - non è troppo lavoro. Ruby fa questo però - '" 1.234 ".to_i' produce 1 – Gishu

risposta

33

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

+2

+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

1

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.

+0

Se lo fai in questo modo, non dimenticare che il delimitatore decimale è diverso su diverse impostazioni regionali. I nostri cugini francesi usano ',' – MarkJ

+0

Naturalmente, pensavo fosse ovvio :) In Russia usiamo anche le virgole. – fuwaneko

4

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.

+0

Non dimenticare che il delimitatore decimale può essere diverso a seconda delle impostazioni regionali. – MarkJ

+0

Ho aggiunto una nota sulla globalizzazione. Grazie! –

+0

Indubbiamente il migliore, @ Mark. +1 dal mio lato. – Kangkan

0

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]); 
} 
+0

Forse non è necessario il ritorno int64 quando si esegue un analisi int32. – btlog

1
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.

0

È 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"); 
    } 
} 
0

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);