.NET moeda formatador: Eu posso especificar o uso de arredondamento do banqueiro?
-
02-07-2019 - |
Pergunta
Alguém sabe como posso obter uma seqüência de formato de usar banqueiros arredondamento ? Tenho vindo a utilizar "{0: c}", mas que não faz rodada da mesma forma que os banqueiros arredondamento faz. O href="http://msdn.microsoft.com/en-us/library/system.math.round.aspx" rel="nofollow noreferrer"> Math.Round()
método faz banqueiros arredondamento. Eu só preciso ser capaz de duplicar como ele rodadas usando uma seqüência de formato.
Nota: a pergunta original foi bastante enganador, e respostas mencionando regex derivam disso.
Solução
Você não pode simplesmente chamar Math.Round () na string de entrada para obter o comportamento desejado?
Em vez de:
string s = string.Format("{0:c}", 12345.6789);
Do:
string s = string.Format("{0:c}", Math.Round(12345.6789));
Outras dicas
Regexp é uma linguagem padrão de correspondência. Você não pode fazer operações aritméticas em Regexp.
Faça alguns experiements com IFormatProvider e ICustomFormatter. Aqui está um link pode apontar na direção certa. http://codebetter.com/blogs/david. Hayden / Arquivo / 2006/03/12 / 140732.aspx
A sua não é possível, uma expressão regular não tem qualquer conceito de "números". Você poderia usar um jogo avaliador , mas você estaria adicionando imperativo de código C #, e se desvia de sua regex único requisito.
Net tem suporte embutido para ambos Aritmética e Bankers' arredondamento:
//midpoint always goes 'up': 2.5 -> 3
Math.Round( input, MidpointRounding.AwayFromZero );
//midpoint always goes to nearest even: 2.5 -> 2, 5.5 -> 6
//aka bankers' rounding
Math.Round( input, MidpointRounding.ToEven );
"Para até mesmo" arredondamento é realmente o padrão, mesmo que "longe de zero" é o que você aprendeu na escola.
Isso ocorre porque sob os processadores de computador capô também fazem banqueiros de arredondamento.
//defaults to banker's
Math.Round( input );
Eu teria pensado que qualquer cadeia de formato arredondamento seria padrão para banqueiros arredondamento, não é este o caso?
Se você estiver usando o .NET 3.5, você pode definir um método de extensão para ajudar você a fazer isso:
public static class DoubleExtensions
{
public static string Format(this double d)
{
return String.Format("{0:c}", Math.Round(d));
}
}
Então, quando você chamá-lo, você pode fazer:
12345.6789.Format();