Formattatore valuta .NET: posso specificare l'uso dell'arrotondamento del banchiere?
-
02-07-2019 - |
Domanda
Qualcuno sa come posso ottenere una stringa di formato per usare arrotondamento banchieri ? Ho usato " {0: c} " ma ciò non avviene allo stesso modo dell'arrotondamento dei banchieri. Il Math.Round ()
< Il metodo / a> esegue l'arrotondamento dei banchieri. Devo solo essere in grado di duplicare il modo in cui viene arrotondato utilizzando una stringa di formato.
Nota: la domanda originale era piuttosto fuorviante e le risposte che menzionavano regex ne derivano.
Soluzione
Non puoi semplicemente chiamare Math.Round () sull'input della stringa per ottenere il comportamento che desideri?
Invece di:
string s = string.Format("{0:c}", 12345.6789);
fare:
string s = string.Format("{0:c}", Math.Round(12345.6789));
Altri suggerimenti
Regexp è un linguaggio di corrispondenza dei pattern. Non puoi fare operazioni aritmetiche in Regexp.
Fai alcuni esperimenti con IFormatProvider e ICustomFormatter. Ecco un link che potrebbe indirizzarti nella giusta direzione. http://codebetter.com/blogs/david. Hayden / archive / 2006/03/12 / 140732.aspx
Non è possibile, un'espressione regolare non ha alcun concetto di "numeri". Puoi utilizzare un valutatore delle corrispondenze ma dovresti aggiungere un codice c # imperativo e allontanarti dal tuo unico requisito regex.
.Net ha integrato il supporto per gli arrotondamenti di aritmetica e bancari:
//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 );
" Per uniformare " l'arrotondamento è in realtà l'impostazione predefinita, anche se "lontano da zero" è quello che hai imparato a scuola.
Ciò è dovuto al fatto che anche i processori informatici eseguono l'arrotondamento dei banchieri.
//defaults to banker's
Math.Round( input );
Avrei pensato che qualsiasi stringa del formato di arrotondamento sarebbe predefinita all'arrotondamento dei banchieri, non è questo il caso?
Se stai usando .NET 3.5, puoi definire un metodo di estensione che ti aiuti a farlo:
public static class DoubleExtensions
{
public static string Format(this double d)
{
return String.Format("{0:c}", Math.Round(d));
}
}
Quindi, quando lo chiami, puoi fare:
12345.6789.Format();