Conversão de string de moeda local
-
09-06-2019 - |
Pergunta
Estou mantendo um aplicativo para um cliente usado em dois locais.Um na Inglaterra e outro na Polónia.
A base de dados está armazenada em Inglaterra e utiliza o formato £1000,00 como moeda, mas a informação está a ser recolhida localmente na Polónia, onde 1000,00 é o formato.
Minha pergunta é: no VB6 existe uma função que pega uma string de moeda em um formato local e converte para outro, ou terei apenas que analisar a string e substituir , ou .?
Aliás, eu olhei para o CCur, mas não tenho certeza se isso fará o que eu quero.
Solução
Os dados não são realmente armazenados como a string "£1000.00"
;ele é armazenado em algum formato numérico.
Barra Lateral: Normalmente, os bancos de dados são configurados para armazenar quantias de dinheiro usando o método decimal tipo de dados (também chamado dinheiro em alguns bancos de dados), ou como um número de ponto flutuante (também chamado dobro).
A diferença é que quando ele é armazenado como decimal certos números como 0,01 são representados exatamente enquanto em dobro esses números só podem ser armazenados aproximadamente, causando erros de arredondamento.
O banco de dados parece armazenar o número como "£1000.00"
porque algo está formatando-o para exibição.No VB6, existe uma função FormatCurrency
que pegaria um número como 1000 e retornaria uma string como "£1000.00"
.
Você notará que o FormatCurrency
A função não aceita um argumento especificando que tipo de moeda usar.Isso ocorre porque ele, juntamente com todas as outras funções específicas de localidade no VB, calcula a moeda a partir da localidade atual do sistema (no Painel de Controle do Windows).
Isso significa que no meu sistema,
Debug.Print FormatCurrency(1000)
irá imprimir $1,000.00
, mas se eu executar o mesmo programa em um computador Windows configurado para a localidade do Reino Unido, ele provavelmente imprimirá £1,000.00
, o que, claro, é algo completamente diferente.
Da mesma forma, você tem algum código, em algum lugar, não sei dizer onde, na Polônia, ao que parece, que é responsável por analisar a string do usuário e convertê-la em um número.E se esse código estiver no Visual Basic, novamente, ele depende do painel de controle para decidir se "". ou "," é o separador de milhares e se "," ou "". é o ponto decimal.
A função CDbl
converte seu argumento em um número.Por exemplo, no meu sistema nos EUA
Debug.Print CDbl("1.200")
produz o número um ponto dois, em um sistema com o Painel de Controle configurado para formatação europeia, produziria o número mil e duzentos.
É possível que o problema seja que você tenha alguém sentado em um computador com o painel de controle regional definido para usar "." como o separador decimal, mas eles estão digitando "," como o separador decimal.
Outras dicas
Qual banco de dados você está usando?E em que tipo de dados a quantidade é armazenada?
Desde que você esteja sempre convertendo de um formato para outro, não precisa fazer a análise, apenas substitua "." com "," ou o contrário.Pode ser necessário remover também o sinal "£" se ele estiver armazenado em sua string.
Provavelmente existe uma resposta correta para lidar com objetos de cultura e coisas assim, mas a maneira mais fácil seria pegar a entrada da entrada polonesa e substituir , por ., e armazená-la em seu banco de dados como tipo "dinheiro" ou "decimal ".Se você sabe que eles (possivelmente configuráveis por usuário) estão sempre inserindo números em polonês ou inglês, você pode ter uma função na qual executa todos os números de entrada para converter a string em uma variável digitada "decimal" adequada.Além disso, para fins de exibição, você pode executá-lo por meio de outra função semelhante para garantir que o usuário sempre veja o formato numérico com o qual se sente confortável.A chave aqui é alterá-lo para um decimal assim que você o obtiver do usuário e apenas alterá-lo novamente para uma string na última etapa, antes de enviá-lo ao usuário.
@KiwiBastard sim, acho que sim.Você está armazenando seu valor em um campo "(n)varchar" ou está usando um campo do tipo moeda/decimal?Se este for o caso, os símbolos de moeda e separadores serão adicionados pelo seu cliente e não haverá necessidade de substituir nada no banco de dados.