2013-09-30 30 views
0

在ASP.NET C#中,我發佈一個值,並在回發我需要解析它爲一個長期價值。以及它看起來,與浮點的值被視爲非數字(或至少非長值) 並且如果發佈值爲50.1long.TryParse double值

long x=0; 
long.TryParse(Request.Form["x"], out x); 

返回0這是默認值。但我需要得到50

+1

如果你真的檢查TryParse的返回值(因爲這是它的重點),它可能會幫助你。 – poke

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

4

返回0是正確的。如果你看看Int64.TryParse它說它只解析整數值。 50.4不是整數值。

相反,您可以將它解析爲Double然後將其舍入。

long x = 0; 
Double value = 0; 
if(Double.TryParse("50.4", out value)) 
{ 
    x = (long)Math.Truncate(value); 
} 
+1

我知道你編輯過'x == Double.NaN',但我只想告訴你關於我學到的一些難題。 '=='不能與'NaN'正常工作。您需要使用'Double.IsNaN(x)'來獲得準確的結果。 –

+0

@ScottChamberlain:謝謝 - 我正在回答速度問題,並記得有一種靜態的檢查方法。只是想在重新考慮我的答案之前查看它。:) – Ian

+1

「Int64將容納比Double更大的值可以處理」 - 嗯,不。最大int64:約9.2e19。最大雙倍:約1.7e308。最大小數點:大約7.9e28。 double的缺點是精度的損失,而不是範圍......雙精度比Int64中的尾數比特更少。 –

1

這是預期的行爲,因爲50.1不是一個很長的值。你應該做的是先將它轉換爲Double,然後截斷它。

double x1, x2; 
double.TryParse(Request.Form["x"], out x1); 
x2 = Math.Truncate(x1); 

如果您擔心該值太大而無法放入double,那麼您必須將其作爲字符串操作。

long x; 
var splits = Request.Form["x"].Split('.'); 
long.TryParse(splits[0], out x); 

請注意,我沒有檢查,如果分割的結果是否有效,但應該讓你開始。

+0

我其實是想到了這一點,但我不確定double是否能夠長期有很大的價值。值可能非常大 –

+0

@AshkanMobayenKhiabani - 然後,您需要先將它用作字符串。按「」分割。然後解析適當的部分。 –

+2

@AshkanMobayenKhiabani然後使用[Decimal.TryParse](http://msdn.microsoft.com/en-us/library/system.decimal.tryparse.aspx)而不是double。 –