2015-08-24 8 views
5

Ich versuche, Zeichenfolgen zu analysieren, die eine Dezimalzahl haben können. Ich benutze Int32.TryParse, aber es scheint nicht zu funktionieren.TryParse funktioniert nicht beim Versuch, eine Dezimalzahl zu einem Int zu analysieren

Hier ist meine Funktion, wo ich versuche zu analysieren:

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

Und hier ist mein Gerät zu testen, die

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

    int? actual = _parser.ParseInt(provided); 

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

versagt Wenn ich meine Unit-Test laufen, null von ParseInt zurückgeführt wird und Ich verstehe nicht warum. Ich dachte TryParse könnte Dezimalzahlen in ganze Zahlen parsen.

+0

Sie könnten auch gleich um die Zahl zuerst, es ist also eine ganze Zahl ... –

+0

Junge, das ist, wie Fragen sein sollen. Einfach, mit funktionierendem Code, der getestet werden kann. Nett. – Jonesopolis

+0

In meiner jetzt entfernten Antwort habe ich 'AllowThousands' mit' AllowDecimalPoint' verwechselt, wobei ersteres 'int.Parse()' erlaubt, Zahlen mit Kommas zu analysieren (abhängig von der Kultur). In einigen Kulturen ist Komma das Dezimaltrennzeichen. Es funktioniert, wenn die Nachkommastellen nur Nullen enthalten (wie [dokumentiert] (https://msdn.microsoft.com/en-us/library/zf50za27 (v = vs.110) .aspx)): http: // ideone .com/stQ9GY. – CodeCaster

Antwort

8

Die Methoden Parse/TryParse sind sehr streng. Sie akzeptieren keine anderen Typen als die, die Sie als Ziel verwenden. 28.789 ist eindeutig kein int so scheitert es. Wenn Sie den Dezimalteil abschneiden möchten, müssen Sie ihn zuerst auf decimal analysieren. Dann können Sie (int)Math.Floor(num) verwenden.

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

Ich wusste nicht, wie streng TryParse war. Danke für Ihre Hilfe. – DFord

+0

Vielleicht möchten Sie die Anweisung verfeinern _ "28.789 ist eindeutig nicht ein int, so dass es fehlschlägt" _ etwas, 'int. (Try) Parse' kann Dezimalzahlen behandeln [solange die Nachkommastellen nur Nullen sind] (https: // msdn.microsoft.com/en-us/library/zf50za27(v=vs.110).aspx0). – CodeCaster

+1

@CodeCaster: Guter Punkt. Aber ich habe nicht gesagt, dass es fehlschlägt, wenn die Eingabezeichenfolge Dezimalstellen enthält. –

Verwandte Themen