Como eu poderia converter dados de string em c #


102

Como eu poderia converter dados de string em long em c #?

Eu tenho dados

String strValue[i] ="1100.25";

agora eu quero dentro

long l1;

1
Longs representam inteiros. Você forneceu um número não inteiro. O que você gostaria de fazer com isso?
— Jon Skeet

1
E se strValue for "1100,75"? Consulte: stackoverflow.com/questions/633335/…
— magma

@magma: se você convertê-lo em decimal, ele arredondará o número, ou seja, neste caso, se o número fornecido foi 1100,75, a saída será 1101.
— love Computer science

1
@charlie, eu estava apenas levantando a questão, porque MayP não parecia estar totalmente ciente das implicações aqui. Ele pode querer simplesmente se livrar da parte não inteira sem nenhum arredondamento, e tudo bem, desde que seja realmente o que ele deseja. Obrigado mesmo assim.
— magma de

Respostas:


187

Esta resposta não funciona mais e não consigo encontrar nada melhor do que as outras respostas (veja abaixo) listadas aqui. Por favor, revise e vote neles.

Convert.ToInt64("1100.25")

Assinatura de método do MSDN:

public static long ToInt64(
    string value
)

3
É assim que eu fiz. Deve ser marcada como a resposta correta.
— sanpaco,

2
Isso dará a exceção de string não no formato correto.
— Badhon Jain de

Isso não funciona. Erro de exceção de formato do sistema. Algum problema com a cadeia de caracteres em um formato incorreto.
— Ricardo Araújo

Correto ... isso parece não funcionar mais, como funcionava em 2013. Postarei uma atualização em breve.
— Will Bellman

46

Se você quiser obter a parte inteira desse número, primeiro deve convertê-lo em um número flutuante e depois converter em longo.

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

Você pode usar a Mathclasse para arredondar o número como quiser ou apenas truncar ...


Isso lhe dará FormatExceptionse você executá-lo na entrada especificada.
— Andrew Savinykh

1
@zespri, não, pelo menos não na maioria das culturas ... Mas realmente falharia em culturas onde o separador decimal não é "."
— Thomas Levesque

16

Você também pode usar long.TryParsee long.Parse.

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


6

Você não poderá convertê-lo diretamente para longo por causa do ponto decimal, acho que você deve convertê-lo em decimal e, em seguida, convertê-lo em longo algo assim:

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

espero que isto ajude!


3

long é internamente representado como System.Int64, que é um inteiro assinado de 64 bits. O valor que você obteve "1100,25" é realmente decimal e não inteiro, portanto, não pode ser convertido para longo.

Você pode usar:

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

para convertê-lo em valor decimal



1

Você também pode fazer usando o Int64.TryParseMétodo. Ele retornará '0' se for qualquer valor de string, mas não gerou um erro.

Int64 l1;

Int64.TryParse(strValue, out l1);

1

Você pode criar sua própria função de conversão:

    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;
    }

Pode ser melhorado ainda mais:

  • desempenho sábio
  • tornar a validação mais rígida no sentido de que atualmente não importa se os caracteres após a primeira casa decimal não são dígitos
  • especifique o comportamento de arredondamento como parâmetro para a função de conversão. atualmente faz arredondamento
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.