Nesta página estão as funcionalidades que utilizo para manipular valores monetários.
Note que ao armazenar um valor monetário o servidor armazena em binário mas ao exibir numa página
este valor precisa ser convertido de acordo com o idioma da página e isto pode causar muitas
vezes erros de exibição..
Idioma |
Separador de Milhares |
Separador de Casas decimais |
Português |
Ponto |
Vírgula |
Inglês |
Vírgula |
Ponto |
Banco de dados |
Não possui |
Ponto |
Com a data acontece o mesmo. Se for ingles é MM/DD/YYYY, se for português é
DD/MM/YYYY, se for japones é YYYY-MM-DD e assim por diante mas no sistema o valor
é armazenado em binário e só no momento de exibição é convertido para o idioma corrente
da página e isso pode ocasionar erros.
Cito um exemplo de um site que trabalhei que exportava os dados para o Excel. No Brasil
funcionava perfeitamente mas se fosse nos EUA o office de lá opera com outro idioma e
os valores monetários, datas eram totalmente corrompidos. Tive que fazer funções de
conversão de valores bem como funções para detectar o idioma do cliente.
Por este motivo vemos tantos erros na exibição de datas e valores monetários.
Veja abaixo meu código.
Funções de moeda ou valores monetários
Valor absoluto - Retira o sinal do valor
''' <summary>
''' Retorna o valor absoluto do número...o módulo do número
''' </summary>
''' <param name="valor"></param>
''' <returns></returns>
Public Function RetornaValorAbsoluto(valor As Single) As Single
Return Math.Abs(valor)
End Function
Arredonda para cima
''' <summary>
''' Remove centavos arredondando para cima
''' </summary>
''' <param name="valor"></param>
''' <returns></returns>
''' 6.0 retorna 6 e de 6.1 a 6.9 retorna 7
Function ArredondaParaCima(valor As Double) As Integer
Return Math.Ceiling(valor)
End Function
Arredonda para baixo
''' <summary>
''' Remove centavos arredondando para baixo
''' </summary>
''' <param name="valor"></param>
''' <returns></returns>
''' 6.0 a 6.9 retorna 6
Function ArredondaParaBaixo(valor As Double) As Integer
Return Math.Floor(valor)
End Function
Identifica se o valor monetário recebido esta no formato BR ou US
''' <summary>
'''identifica se o string numerico recebido contém um valor no formato BR ou US
'''uso : se for BR precisará ser convertido para o padrão US para o MS SQL
'''pode retornar o String ?? indicando tipo irreconhecivel de dado
''' </summary>
''' <param name="valor"></param>
''' <returns></returns>
Public Function identBRUS(valor As String) As String
'valor em branco-não precisa converter
If String.IsNullOrEmpty(valor) Then
Return "US"
End If
'verificando tipo inteiro - não precisa transformação BR->US
If ((valor.IndexOf(".") = -1) & (valor.IndexOf(",") = -1)) Then
Return "US"
End If
'se só tiver . no str - formato = US - Não precisa converter
If ((valor.IndexOf(".") <> -1) And (valor.IndexOf(",") = -1)) Then
Return "US"
End If
'se só tiver , no str -formato = BR-converter
If ((valor.IndexOf(".") = -1) & (valor.IndexOf(",") <> -1)) Then
Return "BR"
End If
'tem , e .
If ((valor.IndexOf(".") <> -1) And (valor.IndexOf(",") <> -1)) Then
'pesquisando da esquerda para direita
'se aparecer primeiramente o . esta em portugues
'se aparecer primeiramente a , esta em Inglês
Dim x As Integer
For x = 0 To x < valor.Length
If (valor(x) = ".") Then
Return "BR"
End If
If (valor(x) = ",") Then
Return "US"
End If
Return "BR"
Next
Return "??" 'formato desconhecido
Throw New Exception("Tipo numérico desconhecido: " + valor.ToString())
End If
Return "??" 'formato desconhecido
End Function
Convertendo o formato da moeda do padrão BR para o padrão Americano
( e padrão dos bancos de dados)
''' <summary>
'''converte o valor recebido para o formato numerico americano para ser salvo no ms sql
''' </summary>
''' <param name="Valor"></param>
''' <returns></returns>
Public Function BRtoUSA(Valor As Double) As String
Dim rasc As String
rasc = Convert.ToString(Valor)
If (identBRUS(rasc) = "BR") Then
rasc = rasc.Replace(".", "")
rasc = rasc.Replace(",", ".")
End If
Return rasc
End Function