2015-08-24 13 views
5

sto cercando di analizzare le stringhe che possono avere un decimale. Sto usando Int32.TryParse ma non sembra funzionare.TryParse non funziona quando si cerca di analizzare un numero decimale a un Int

Qui è la mia funzione in cui cerco di analizzare:

private NumberStyles styles = NumberStyles.Number; 
private CultureInfo culture = CultureInfo.CurrentCulture; 
public int? ParseInt(string node) 
{ 
    int number; 
    if (Int32.TryParse(node, styles, culture.NumberFormat, out number)) 
    { 
     return number; 
    } 
    return null; 
} 

Ed ecco il mio test di unità che sta fallendo

[Fact] 
public void TestParseIntWithDecimal() 
{ 
    string provided = "28.789"; 
    int expected = 28; 

    int? actual = _parser.ParseInt(provided); 

    Assert.NotNull(actual); 
    Assert.Equal(expected, actual); 
} 

Quando eseguo il mio test di unità, null viene restituito da ParseInt e Non capisco perché. Pensavo che TryParse potesse analizzare i numeri decimali in numeri interi.

+0

Si potrebbe anche solo attorno al numero di prima, quindi è un numero intero ... –

+0

ragazzo, questo è come le domande dovrebbero essere. Semplice, con codice funzionante che può essere testato. Bello. – Jonesopolis

+0

Nella mia risposta ormai rimosso ho confuso '' AllowThousands' con AllowDecimalPoint', dove il primo può lasciare 'int.Parse()' analizzare i numeri con una virgola (a seconda della cultura). In alcune culture, la virgola è il separatore decimale. Si _does_ funziona se le cifre decimali contengono solo zeri (come [documentato] (https://msdn.microsoft.com/en-us/library/zf50za27 (v = vs.110) aspx)): http: // Ideone .com/stQ9GY. – CodeCaster

risposta

8

I Parse/TryParse metodi sono molto severe. Non accettano altri tipi oltre a quello che usi come target. 28.789 è chiaramente non un int così fallisce. Se si desidera troncare la parte decimale, è necessario prima analizzarla su decimal. Quindi è possibile utilizzare (int)Math.Floor(num).

private NumberStyles styles = NumberStyles.Number; 
private CultureInfo culture = CultureInfo.CurrentCulture; 
public int? ParseInt(string node) 
{ 
    decimal number; 
    if (decimal.TryParse(node, styles, culture.NumberFormat, out number)) 
    { 
     return (int) Math.Floor(number); // truncate decimal part as desired 
    } 
    return null; 
} 
+0

Non mi ero reso conto di quanto fosse intenso TryParse. Grazie per l'aiuto. – DFord

+0

Si consiglia di perfezionare la dichiarazione _ "28,789 chiaramente non è un int in modo che non riesce" _ un po ', 'int (Prova) Parse' in grado di gestire decimali [fino a quando le cifre decimali sono tutti zeri] (https: //. msdn.microsoft.com/en-us/library/zf50za27(v=vs.110).aspx0). – CodeCaster

+1

@CodeCaster: buon punto. Ma non ho detto che fallisce se la stringa di input contiene posizioni decimali. –

Problemi correlati