Jump to content
luisribeiro.pt

Conversão de string para decimal

Recommended Posts

luisribeiro.pt

Boa tarde a todos, peço a vossa ajuda!

estou com com um problema na conversão de uma string que contém um número em notação cientifica, por exemplo "1.001E-02", e não estou a conseguir converter para decimal (Penso ser o mais correcto). Ou surge erro de string de entrada com formato incorrecto ou o resultado numérico da conversão é incorrecto (não tem em conta o expoente).

Cumprimentos

Luís

Share this post


Link to post
Share on other sites
luisribeiro.pt

Penso que o problema era no separador decimal, não reconhecia o ponto.

           string s = "1,0052E-01";
           decimal res;
            res = decimal.Parse(s, NumberStyles.Any);
            Console.Write(res);

Por agora parece OK.

Obrigado

Share this post


Link to post
Share on other sites
vesteves

luisribeiro.pt, atenção que é preciso ter em conta que isso apenas funciona se considerar a Culture actual, o que pode não ser exactamente o que se pretende...

Já agora, e porque não tem no código apresentado qualquer tipo de tratamento de excepções, já foi considerado o uso do método TryParse() ao invés do método Parse()?

Cumprimentos,

Virgílio

Share this post


Link to post
Share on other sites
luisribeiro.pt

luisribeiro.pt, atenção que é preciso ter em conta que isso apenas funciona se considerar a Culture actual, o que pode não ser exactamente o que se pretende...

Já agora, e porque não tem no código apresentado qualquer tipo de tratamento de excepções, já foi considerado o uso do método TryParse() ao invés do método Parse()?

Cumprimentos,

Virgílio

Virgílio, obrigado pelo seu comentário.

Eu ainda estou um pouco "verde" nisto do c# e POO, a minha área de formação é Eng. Biomédica... vou aprendendo com o google  :)

O objectivo é ler ficheiros txt que se encontram armazenados no pc e que têm a mesma formação. Como funcionou "bem" não me preocupei mais, corro o risco de não funcionar correctamente noutro computador?

Aproveito para pedir uma explicaçãozinha como e onde se deve utilizar try e catch (penso que seja assim) para o tratamento das excepções.

Obrigado

Luís

Share this post


Link to post
Share on other sites
vesteves

Peço desculpa pela demora, mas não tinha tido ainda oportunidade de responder.

Quando utiliza o método Parse() do decimal, ele tem em conta a Culture actual do sistema operativo, ou seja, o comportamento é diferente caso o sistema seja em Inglês ou em Português, por exemplo. Tendo isto em conta, efectivamente o seu programa pode funcionar num sistema e não funcionar noutro.

Caso nos números fornecidos não sejam usados os separadores decimais, e para não ter de lidar com a condicionante do idioma do sistema operativo, deve passar para a função Parse() ou TryParse() a Culture como InvariantCulture.

string numberToConvert = "1.001E-02";
decimal result = decimal.Parse(numberToConvert, NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent, CultureInfo.InvariantCulture.NumberFormat);
Console.Write(result);

No entanto, o Parse() pode dar uma excepção do tipo FormatException, que deve ser tratada e que ocorrerá caso seja utilizado como separador decimal a ",". Como nota, todos os locais onde podem ocorrer excepções devem ser tratados, desde que seja possível recuperar dos mesmos. Podemos utilizar o seguinte código para lidar com o uso do "." ou da "," nas strings fornecidas:

string numberToConvert = "1.001E-02";
decimal result;
try
{
result = decimal.Parse(numberToConvert, NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent, CultureInfo.InvariantCulture.NumberFormat);
} catch (FormatException)
{
result = decimal.Parse(numberToConvert, NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent, CultureInfo.CurrentCulture.NumberFormat);
}
Console.Write(result);

Caso pretenda evitar a necessidade de tratamento de excepções, pode fazer uso do método TryParse(), pois este devolve um bool que indica se a conversão ocorreu com sucesso ou não.

string numberToConvert = "1.001E-02";
decimal result;
if (!decimal.TryParse(numberToConvert, NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent, CultureInfo.InvariantCulture.NumberFormat, out result))
{
decimal.TryParse(numberToConvert, NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent, CultureInfo.CurrentCulture.NumberFormat, out result);
}
Console.Write(result);

Espero que os exemplos o ajudem a perceber melhor o funcionamento e tratamento das coisas, mas caso seja preciso alguma coisa, é só dizer :(

Cumprimentos,

Virgílio

Share this post


Link to post
Share on other sites
luisribeiro.pt

Caro vesteves, obrigado pela sua resposta, uma boa ajuda com certeza!

Vou melhorar o código quando tiver possibilidade.

Estamos sempre a aprender  :(

Cumprimentos

Luis

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.