C # Double - форматирование ToString для отображения значения в центах без отображения десятичной дроби - PullRequest
2 голосов
/ 28 июля 2010

У меня есть ситуация, когда мне нужно отобразить двойное значение, округленное до двух знаков после запятой, но отображенное без десятичного знака.Будут некоторые ситуации, когда я захочу использовать один и тот же код и по-разному отображать двойное значение, поэтому я надеялся, что смогу справиться с этим, передав шаблон строкового формата.

Например, двойное значение может быть: 11367.2232 Я хочу, чтобы значение было: 1136722

В другом примере значение может быть 344576.3457. Я хочу, чтобы значение было 34457635

* 1006.* В третьем примере это значение может быть 546788. Я хочу, чтобы оно было 54678800

Итак, я хочу сделать что-то такое:

String.Format("{PATTERN}", dblCurrency);

Есть ли шаблон форматирования, который бы округлял обадо 2 знаков после запятой и убрать десятичную дробь из отображаемого?

Ответы [ 4 ]

18 голосов
/ 28 июля 2010

Сначала , за (очень) несколькими исключениями, обычно плохая идея использовать double для манипулирования валютными значениями .Вы действительно должны использовать decimal для представления таких сумм.

Секунда , округление и форматирование отображения - это отдельные операции, и ваш код должен выражать их отдельно.string.Format() не предоставляет единой маски формата, которая будет выполнять обе задачи, но вы можете легко добиться того, что ищете:

decimal amount = 11367.3456m
String.Format( "{0:0}", amount*100 );

, который будет выдавать:

1136735

D0 спецификатор формата выдает числовые значения без разделителей и без цифр после десятичной точки.Вы также можете просто использовать ToString(), но я думаю, что спецификатор формата передает намерение более четко.

0 голосов
/ 28 июля 2010

Чтобы получить то, что вам нужно, попробуйте что-то вроде:

decimal dNumber = 11367.2232;
String.Format( "{0:0}", Math.Round(amount, 2) * 100));

Это должно вывести 1136722.

0 голосов
/ 28 июля 2010

Вы можете использовать пользовательскую функцию форматирования, например:

string ScaledFormat(string format, double value, double scaleFactor)
{
    return(string.Format(format, Math.Round(value * scalefactor, 0)));
}

или, если у вас есть только несколько стилей форматирования, я бы использовал перечисление:

enum CustomFormat { Integer, IntegerX100 };
string ScaledFormat(CustomFormat format, double value)
{
    switch(format)
    {
        case CustomFormat.Integer:     return(string.Format("{0}", (int) value);
        case CustomFormat.IntegerX100: return(string.Format("{0}", Math.Round(value * 100.0, 0));
    }
}

Это означает, что существует определенное количество способов форматирования значения, и фактическое преобразование полностью инкапсулируется в методе, обеспечивая согласованный вывод во всей вашей программе и избегая разбрасывания «магических констант» повсюду. Он также централизует форматирование, так что вы можете легко настроить его в будущем, не находя и не исправляя сотни различных строк. Вызывайте форматирование и сокращайте необходимое тестирование, поскольку вы просто повторно используете небольшой кусок хорошо протестированного кода. И это делает случаи, когда вы форматируете строку, намного проще для чтения / понимания (самодокументируемый код).

0 голосов
/ 28 июля 2010

Используйте это:

var dblCurrency = 11367.2232D;
var rounded = Math.Round(dblCurrency, 2);
var cents = rounded*100;
var centString = cents.ToString();
...