CDBL OU MULTIPLICA O VALOR ?

HORICH 02/07/2013 12:39:57
#425457
Bom é uma duvida besta mais ao mesmo tempo primordial

Eu tenho um valor que estra vindo como string assim
Dim valor As String = [Ô]2240.00[Ô]

Para formatar ele para valor (R$) eu tenho que converter ele para poder usar o format certo? foi essa maneira que eu achei =s

então pela logica eu faço isso
Dm ValorDoub As Double = Cdbl(valor)


Só que quando eu faço ele converter de String(Valor) para o Double(ValorDoub)

Ele pega o [Ô]2240.00[Ô] e faz virar 224000.0 Por quê ? No VB6 isso ia normal

Ai a coisa piora por que para eu poder formatar este valor com o format ele tem que ser numerico Ex.


Format(224000.0, [Ô]C[Ô]) ele faz virar : R$ 224.000,00

Então como eu posso formatar um valor corretamente sendo que o cdbl faz ele [Ô]crescer[Ô]?

Tem outra forma de usar o format por ex.
Format(valor, [Ô]##,##0.00[Ô]) igual no VB6 ? por que eu fui tentar usar esse tipo de formatação e não foi =(
KERPLUNK 02/07/2013 13:29:41
#425458
1 - Pare de comparar .NET com VB6, isso simplesmente não é certo e só vai te causar confusão
2 - Para valores numéricos, use tipo de dados numéricos, se você precisa exibir valores numéricos com formatos diferentes, use o format com suas opções corretas
OCELOT 02/07/2013 13:44:06
#425459
O problema na conversão é a cultura que está sendo usada, no caso provavelmente é pt-BR, que diz que o separador decimal é a vírgula, o ponto é apenas o de agrupamento de dígitos

Você pode corrigir isso fazendo a conversão assim:

Dim ValorDoub As Double = Convert.ToDouble(valor, Globalization.CultureInfo.InvariantCulture)

Usando o InvariantCulture ele vai considerar o ponto como separador decimal na hora de fazer a conversão
HORICH 02/07/2013 13:45:21
#425460
Certo pode ser diferente mais a minha duvida é por que o cdbl não transforma somente ? Ele Esta aumentando o valor =s
HORICH 02/07/2013 13:51:47
#425461
Citação:

:
O problema na conversão é a cultura que está sendo usada, no caso provavelmente é pt-BR, que diz que o separador decimal é a vírgula, o ponto é apenas o de agrupamento de dígitos

Você pode corrigir isso fazendo a conversão assim:

Dim ValorDoub As Double = Convert.ToDouble(valor, Globalization.CultureInfo.InvariantCulture)

Usando o InvariantCulture ele vai considerar o ponto como separador decimal na hora de fazer a conversão




Isso mesmo funcionou, obrigado essa era o problema, então ele leva em conta o tipo de valor que esta formatado o windows ?
OCELOT 02/07/2013 14:01:57
#425462
Sim, por padrão ele pega a configuração do Windows, mas definindo uma cultura manualmente faz com que ele use a cultura informada por você
OMAR2011 02/07/2013 14:02:44
#425463
Faça um teste deste jeito.

Dim valor As String = Val([Ô]2240.00[Ô])
Dim MyDouble As Double

[ô]MyDouble = CDbl(valor)
MyDouble = (valor)
TextBox2.Text = FormatCurrency(MyDouble)
[ô]TextBox1.Text = Format(MyDouble, [Ô]##,##0.00[Ô])
TextBox1.Text = Format(CDbl(valor), [Ô]Currency[Ô])

Não vá contra o Famigerado.
HORICH 02/07/2013 14:17:08
#425466
Citação:

:
Faça um teste deste jeito.

Dim valor As String = Val([Ô]2240.00[Ô])
Dim MyDouble As Double

[ô]MyDouble = CDbl(valor)
MyDouble = (valor)
TextBox2.Text = FormatCurrency(MyDouble)
[ô]TextBox1.Text = Format(MyDouble, [Ô]##,##0.00[Ô])
TextBox1.Text = Format(CDbl(valor), [Ô]Currency[Ô])

Não vá contra o Famigerado.




Tambem Funcionou o comando val([Ô]String[Ô]) ele deixa a mesma propriedade do comando Convert.ToDouble(valor, Globalization.CultureInfo.InvariantCulture)?
OCELOT 02/07/2013 15:43:20
#425473
Resposta escolhida
O Val é um pouco diferente da outra conversão, ele ignora a cultura atual, considera apenas o ponto como separador decimal e não considera nada como agrupamento de dígitos, e ele aceita valores não numéricos, porém ele para de tentar converter assim que ele acha um valor que não é numérico, e tenta converter valores que estão em outro formato, como caso ele encontre um &H no começo do texto ele tenta converter de hexadecimal para decimal

Por exemplo, o valor [Ô]100.99[Ô] ele converte para 100,99, porém o valor [Ô]100,99[Ô] ele converte para 100, pois ele considera a vírgula como texto

Se você passar um valor do tipo [Ô]100.99 teste[Ô] ele converte para 100,99 ignorando o texto que tinha no final, porém se o valor começar com qualquer coisa que não seja numérico ele retorna 0

Valores do tipo [Ô]1.001,99[Ô] ele vai converter para 1,001 pois vai considerar o primeiro ponto como sendo o separador de casas decimais e a vírgula como texto, ignorando ela e tudo que vem depois.

No geral eu não recomendo usar o Val, acho muito melhor usar as funções de conversão que só convertem se o valor estiver no formato correto, já que val nunca retorna erro se passarem um valor incorreto pode-se nem perceber que o valor está errado até ser tarde demais, acho que é uma função que tenta ser muito genérica, ela pode acabar fazendo algo que você não queria que ela fizesse
HORICH 02/07/2013 16:30:33
#425477
Citação:

:
O Val é um pouco diferente da outra conversão, ele ignora a cultura atual, considera apenas o ponto como separador decimal e não considera nada como agrupamento de dígitos, e ele aceita valores não numéricos, porém ele para de tentar converter assim que ele acha um valor que não é numérico, e tenta converter valores que estão em outro formato, como caso ele encontre um &H no começo do texto ele tenta converter de hexadecimal para decimal

Por exemplo, o valor [Ô]100.99[Ô] ele converte para 100,99, porém o valor [Ô]100,99[Ô] ele converte para 100, pois ele considera a vírgula como texto

Se você passar um valor do tipo [Ô]100.99 teste[Ô] ele converte para 100,99 ignorando o texto que tinha no final, porém se o valor começar com qualquer coisa que não seja numérico ele retorna 0

Valores do tipo [Ô]1.001,99[Ô] ele vai converter para 1,001 pois vai considerar o primeiro ponto como sendo o separador de casas decimais e a vírgula como texto, ignorando ela e tudo que vem depois.

No geral eu não recomendo usar o Val, acho muito melhor usar as funções de conversão que só convertem se o valor estiver no formato correto, já que val nunca retorna erro se passarem um valor incorreto pode-se nem perceber que o valor está errado até ser tarde demais, acho que é uma função que tenta ser muito genérica, ela pode acabar fazendo algo que você não queria que ela fizesse




Entendi então por questão de segurança o val é menos aconselhado mesmo, Obrigado pela a ajuda
Tópico encerrado , respostas não são mais permitidas