Как я мог преобразовать данные из строки в длинные в с #


102

Как я могу преобразовать данные из строки в длинные в C #?

У меня есть данные

String strValue[i] ="1100.25";

теперь я хочу это в

long l1;

1
Длинные числа представляют собой целые числа. Вы указали нецелое число. Что бы вы хотели с этим делать?
Джон Скит,

1
Что, если strValue равно «1100,75»? См .: stackoverflow.com/questions/633335/…
magma

@magma: если вы конвертируете его в десятичное число, оно округлит число, то есть в этом случае, если заданное число было 1100,75, оно выведет 1101.
люблю Компьютерные науки

1
@charlie Я просто поднял вопрос, потому что MayP, похоже, не полностью осознавал значение этого. Он может захотеть просто избавиться от нецелой части без округления, и это нормально, при условии, что это действительно то, что он хочет. Однако, спасибо.
magma

Ответы:


187

Этот ответ больше не работает, и я не могу придумать ничего лучше, чем другие ответы (см. Ниже), перечисленные здесь. Просмотрите их и проголосуйте за них.

Convert.ToInt64("1100.25")

Подпись метода из MSDN:

public static long ToInt64(
    string value
)

3
Вот как я это сделал. Должен быть отмечен как правильный ответ.
sanpaco

2
Это приведет к исключению строки не в правильном формате.
Badhon Jain

Это не работает. Ошибка исключения системного формата. Некоторая проблема с цепочкой символов в неправильном формате.
Рикардо Араужо,

Это правильно .... похоже, это больше не работает, как это было в 2013 году. Я скоро опубликую обновление.
Уилл Беллман

46

Если вы хотите получить целую часть этого числа, вы должны сначала преобразовать его в плавающее число, а затем преобразовать в long.

long l1 = (long)Convert.ToDouble("1100.25");

Вы можете использовать Mathкласс, чтобы округлить число по своему усмотрению или просто усечь ...


Это даст вам, FormatExceptionесли вы запустите это на указанном входе.
Андрей Савиных

1
@zespri, нет, по крайней мере, не в большинстве культур ... Но он действительно потерпит неудачу в культурах, где десятичный разделитель не является "."
Thomas Levesque

17

Вы также можете использовать long.TryParseи long.Parse.

long l1;
l1 = long.Parse("1100.25");
//or
long.TryParse("1100.25", out l1);


6

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

String strValue[i] = "1100.25";
long l1 = Convert.ToInt64(Convert.ToDecimal(strValue));

надеюсь это поможет!


3

long внутренне представлен как System.Int64, который представляет собой 64-битное целое число со знаком. Взятое вами значение «1100,25» на самом деле является десятичным, а не целым числом, поэтому его нельзя преобразовать в длинное.

Ты можешь использовать:

String strValue = "1100.25";
decimal lValue = Convert.ToDecimal(strValue);

преобразовать его в десятичное значение



1

Вы также можете использовать Int64.TryParseметод. Он вернет «0», если это любое строковое значение, но не сгенерировало ошибку.

Int64 l1;

Int64.TryParse(strValue, out l1);

1

Вы можете создать свою собственную функцию преобразования:

    static long ToLong(string lNumber)
    {
        if (string.IsNullOrEmpty(lNumber))
            throw new Exception("Not a number!");
        char[] chars = lNumber.ToCharArray();
        long result = 0;
        bool isNegative = lNumber[0] == '-';
        if (isNegative && lNumber.Length == 1)
            throw new Exception("- Is not a number!");

        for (int i = (isNegative ? 1:0); i < lNumber.Length; i++)
        {
            if (!Char.IsDigit(chars[i]))
            {
                if (chars[i] == '.' && i < lNumber.Length - 1 && Char.IsDigit(chars[i+1]))
                {
                    var firstDigit = chars[i + 1] - 48;
                    return (isNegative ? -1L:1L) * (result + ((firstDigit < 5) ? 0L : 1L));    
                }
                throw new InvalidCastException($" {lNumber} is not a valid number!");
            }
            result = result * 10 + ((long)chars[i] - 48L);
        }
        return (isNegative ? -1L:1L) * result;
    }

Его можно улучшить дальше:

  • производительность мудрая
  • сделать проверку более строгой в том смысле, что в настоящее время ему все равно, не являются ли символы после первого десятичного знака цифрами
  • укажите поведение округления в качестве параметра для функции преобразования. в настоящее время он округляет
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.