2013-09-30 3 views
0

в ASP.NET C#, я отправляю значение и в postback мне нужно проанализировать его как длинное значение. так же как это выглядит, значение с плавающей точкой рассматриваются как нечисловые (или по крайней мере, не являющиеся длинные значения) и если посланное значение 50.1long.TryParse double values ​​

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 не является Целочисленным значением.

Вместо этого вы можете разобрать его как Двойной, а затем округлить его.

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 может обрабатывать» - um, no. Макс int64: около 9.2e19. Макс двойное: около 1.7e308. Максимальное десятичное значение: около 7.9e28. Недостатком двойника является потеря точности, а не диапазон ... меньше бит мантиссы в два раза, чем в Int64. –

1

Это ожидаемое поведение, так как 50.1 не является длинным значением. То, что вам нужно сделать, это сначала преобразовать его в Double, затем усечь его.

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

Если вы опасаетесь значение будет слишком большой, чтобы поместиться в два раза, то вам придется манипулировать его в виде строки.

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

Обратите внимание, что я не проверял, является ли результат раскола действительным или нет, но это должно вас начать.

+0

Я на самом деле думал об этом, но я не уверен, что удвоение может иметь большую ценность. значения могут быть очень большими –

+0

@AshkanMobayenKhiabani - тогда вам нужно будет использовать его как строку сначала. Разделить на "." затем проанализируйте соответствующую часть. –

+2

@AshkanMobayenKhiabani Затем используйте [Decimal.TryParse] (http://msdn.microsoft.com/en-us/library/system.decimal.tryparse.aspx) вместо двойного. –

Смежные вопросы