ASP NET - Finanças

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