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;
MayureshP
fonte
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
)
Will Bellman
fonte
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 ...

BrunoLM
fonte
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);
majid zareei
fonte
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!

amo ciência da computação
fonte
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

sandyiit
fonte
2
long l1 = Convert.ToInt64(strValue);

Isso deve resolver.

Stuartmclark
fonte
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);
Pankaj Agarwal
fonte
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
Cosmin Sontu
fonte