Средство форматирования валюты .NET:Могу ли я указать использование банковского округления?

StackOverflow https://stackoverflow.com/questions/128443

Вопрос

Кто-нибудь знает, как я могу использовать строку формата? банкиры округляют?Я использовал «{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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top