Форматер валют .NET: можно ли указать порядок использования банковского округления? - PullRequest
4 голосов
/ 24 сентября 2008

Кто-нибудь знает, как я могу получить строку формата для использования банкиров округления ? Я использовал "{0: c}", но это не округляет так же, как округление банкиров. Метод Math.Round() делает округление банкиров. Мне просто нужно иметь возможность дублировать способ округления, используя строку формата.


Примечание: первоначальный вопрос был довольно вводящим в заблуждение, и из него вытекают ответы с упоминанием регулярного выражения.

Ответы [ 5 ]

3 голосов
/ 24 сентября 2008

Разве вы не можете просто вызвать Math.Round () для строкового ввода, чтобы получить желаемое поведение?

Вместо:

string s = string.Format("{0:c}", 12345.6789);

Do:

string s = string.Format("{0:c}", Math.Round(12345.6789));
3 голосов
/ 24 сентября 2008

Regexp - язык сопоставления с образцом. Вы не можете выполнять арифметические операции в регулярном выражении.

Проведите несколько экспериментов с IFormatProvider и ICustomFormatter. Вот ссылка может указать вам в правильном направлении. http://codebetter.com/blogs/david.hayden/archive/2006/03/12/140732.aspx

0 голосов
/ 25 сентября 2008

Если вы используете .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();
0 голосов
/ 24 сентября 2008

.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 );

Я бы подумал, что любая строка формата округления по умолчанию будет округлять банкиров, разве это не так?

0 голосов
/ 24 сентября 2008

Это невозможно, регулярное выражение не имеет понятия "числа". Вы могли бы использовать оценщик совпадений , но вы бы добавили императивный код c # и отклонились бы от требования только регулярных выражений.

...