Як я міг перетворити дані з рядка в довгий в c #


102

Як я можу перетворити дані з рядка в довгий в C #?

У мене є дані

String strValue[i] ="1100.25";

тепер я хочу це

long l1;

1
Довгі представляють цілі числа. Ви вказали не ціле число. Що б ви хотіли з цим зробити?
Джон Скіт

1
Що робити, якщо strValue дорівнює "1100,75"? Дивіться: stackoverflow.com/questions/633335/…
магма

@magma: якщо перетворити його в десятковий, то воно округлятиме число, тобто в цьому випадку, якщо задане число було 1100,75, то воно виведе 1101.
люблю інформатику

1
@charlie Я просто піднімав це питання, тому що, можливо, MayP не повністю усвідомлює наслідки. Він може хотіти просто позбутися нецілої частини без жодного округлення, і це добре, за умови, що це дійсно те, що він хоче. Дякую, хоча.
магма

Відповіді:


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, ні, принаймні, не в більшості культур ... Але це справді не вдасться в культурах, де десятковий роздільник не "."
Томас Левеск

16

Ви також можете використовувати long.TryParseі long.Parse.

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


6

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

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.