2008-09-24 7 views
4

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


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

+0

Какие регулярного выражения {0: c}? Похож на строку формата .NET для меня ... – Shog9 2008-09-24 17:18:06

+0

Просто из любопытства, почему это должно быть регулярным выражением? Похоже, что использование существующего кода было бы более безопасным, так как он вряд ли содержит ошибки. – 2008-09-24 17:19:39

+0

Что такое округление банкира? Если в пользу банка, то в противном случае? – 2008-09-24 17:25:31

ответ

3

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

Вместо:

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

Do:

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

Regexp - это язык, соответствующий шаблону. Вы не можете выполнять арифметические операции в Regexp.

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

0

Невозможно, регулярное выражение не имеет понятия «числа». Вы можете использовать match evaluator, но вы бы добавили императивный код C# и отклонялись от вашего требования только к регулярному выражению.

0

.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

Если вы используете .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();