ODP ADO.NET driver retorna decimal com zero a mais na representação de cadeia
Pergunta
O problema de hoje é a seguinte: temos uma tabela em um banco de dados Oracle. A tabela contém um campo que é do tipo de número (18, 3).
Na superfície, ambos salvar e carregar dados de trabalho de campo disse perfeitamente. Contudo, uma inspecção mais aprofundada revela, que os números que têm três dígitos decimais neles, por exemplo 500,001, são lidos a partir da base de dados de maneira tal que o representação da cadeia do decimal tem um quarto, de zero dígitos (por exemplo, 500,0010). Isto parece acontecer sempre que o terceiro dígito decimal é diferente de zero.
Para fins de matemática, este não é um problema. No entanto, temos validadores que verificam o número de dígitos decimais em um número decimal, convertendo-a uma corda e, em seguida, contar o número de dígitos decimais. Desde esta parte particular de dados é definido para ter no máximo três dígitos decimais, o zero adicional causa um erro de validação.
Uma vez que eu não posso mudar os validadores, estou me perguntando se existe uma maneira limpa para obter o decimal, sem o extra de zero, além de converter o número para uma cadeia, aparar os zeros à direita e, em seguida, re-análise isto? Ou eu deveria estar fazendo algo completamente diferente?
Solução
Tente isto:
decimal trimmed = ((decimal)((int)(number * 1000))) / 1000
A projeção para int se livrar da parte fracionária. Você não precisa de todos os parênteses, mas eu acho que é mais fácil ver o que está acontecendo, se a ordem das operações é explictily indicado.
Outras dicas
Eu corri para o mesmo problema, mas eu usei: number.ToString("F3")