В .NET, как я могу конвертировать из «0,000» в «длинный»? - PullRequest
2 голосов
/ 08 июня 2010

У меня есть строка «0,000» (или любая похожая строка), которую я хотел бы преобразовать в long. Я с удовольствием "отрублю" что-нибудь после десятичной дроби.

Как лучше всего это сделать?

Я могу конвертировать в double, а затем в long, но мне просто интересно, есть ли более простой способ. Все следующие операторы выдают исключения:

long l3 = Convert.ToInt64(nrToConvert);

long l1;
long.TryParse(nrToConvert, out l1);

long l2 = long.Parse(nrToConvert);

Ответы [ 5 ]

5 голосов
/ 08 июня 2010

В общем случае при разборе строкового значения я бы сначала проанализировал его по типу, который он представляет. Так что в этом случае парсит его как двойной, так как это двойной. И да, я написал парс, а не конвертировал намеренно. Есть много вещей, которые могут пойти не так при разборе строки, поэтому всегда планируйте сбой анализа! это почти наверняка будет в какой-то момент.

double val;
if(double.TryParse(nrToConvert,out val))
{
  //yous should validate that the value is within the expected range as well
  return (long)val;
}
else
{
  //do some error handling;
}
3 голосов
/ 08 июня 2010

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

        long value = long.Parse("0.000", System.Globalization.NumberStyles.AllowDecimalPoint);

Однако она не будет усекать или округлять для вас числа, отличные от нулябросить исключение (или не выполнить TryParse).Вам необходимо явно применить желаемый тип усечения:

        long value = (long)decimal.Parse("1.500");

Или использовать Math.Round, Truncate, Ceiling.Обратите внимание, что технически не следует использовать double.Parse (), long имеет слишком много цифр, чтобы быть точно представленными в double (19, double поддерживает только 15 значащих цифр).

2 голосов
/ 08 июня 2010

Вы пытались что-то связать с этим:

(long)Math.Round(double.Parse("1.234"));

Конечно, вы должны сначала использовать TryParse, но это должно помочь вам начать.

1 голос
/ 08 июня 2010

Ничего из этого не сработает (вы получите исключение «Строка в неправильном формате», TryParse просто потерпит неудачу), вам нужно либо
1) Сначала преобразовать строку в двойное, затем привестив Long

long lng = (long)Convert.ToDouble(nrToConvert); 

или

2) Обрезать десятичную строку и преобразовать это (что-то вроде)

string nrToConvert =  "0.000";
nrToConvert = nrToConvert.IndexOf('.') > 0 ? nrToConvert.Substring(0, nrToConvert.IndexOf('.') ) : nrToConvert;

long lng = Convert.ToInt64(nrToConvert);

Однако я бы пошел случше отражает то, что вы делаете (беря двойное и конвертируя это в длинное)

1 голос
/ 08 июня 2010
long myLong = Int64.Parse('0.000');

Может выдавать исключение System.FormatException, поэтому оно может удовлетворить это. Также есть Int64.TryParse(), если вы просто хотите, чтобы он возвращал 0, если он не может разобрать.

...