Средство форматирования валюты .NET:Могу ли я указать использование банковского округления?
-
02-07-2019 - |
Вопрос
Кто-нибудь знает, как я могу использовать строку формата? банкиры округляют?Я использовал «{0:c}», но это округление происходит не так, как округление банкиров.А Math.Round()
Метод банкиров округляет.Мне просто нужно иметь возможность дублировать способ округления, используя строку формата.
Примечание: исходный вопрос вводил в заблуждение, и ответы, в которых упоминается регулярное выражение, вытекают из этого.
Решение
Разве вы не можете просто вызвать Math.Round() для ввода строки, чтобы получить желаемое поведение?
Вместо:
string s = string.Format("{0:c}", 12345.6789);
Делать:
string s = string.Format("{0:c}", Math.Round(12345.6789));
Другие советы
Regexp — это язык сопоставления с образцом.Вы не можете выполнять арифметические операции в Regexp.
Проведите несколько экспериментов с IFormatProvider и ICustomFormatter.Вот ссылка может указать вам в правильном направлении. http://codebetter.com/blogs/david.hayden/archive/2006/03/12/140732.aspx
Это невозможно, регулярное выражение не имеет понятия «числа».Вы можете использовать оценщик матча но вы добавите императивный код С# и отклонитесь от требования только к регулярному выражению.
.Net имеет встроенную поддержку как арифметического, так и банковского округления:
//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 );
На самом деле по умолчанию используется округление «до четности», хотя «дальше от нуля» — это то, чему вас учили в школе.
Это потому, что компьютерные процессоры также выполняют банковские операции по округлению.
//defaults to banker's
Math.Round( input );
Я бы подумал, что любая строка формата округления по умолчанию будет соответствовать банковскому округлению, не так ли?
Если вы используете .NET 3.5, вы можете определить метод расширения, который поможет вам в этом:
public static class DoubleExtensions
{
public static string Format(this double d)
{
return String.Format("{0:c}", Math.Round(d));
}
}
Затем, когда вы его вызываете, вы можете сделать:
12345.6789.Format();