Специальное десятичное форматирование - PullRequest
4 голосов
/ 02 декабря 2010

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

123 => "123"
123.4 => "123.40"
123.45 => "123.45"
123.456 => "123.46"

На английском языке число всегда должно отображаться с точностью до двух десятичных знаков, кроме случаев, когда оно содержитцелочисленное значение, когда оно не должно иметь десятичных дробей (поэтому не допускается отображение «123.00»).

Ответы [ 5 ]

1 голос
/ 02 декабря 2010

Боюсь, я не знаю ни одного такого формата. Возможно, вам придется использовать:

string text = (d == (int) d) ? ((int) d).ToString() : d.ToString("N2");

РЕДАКТИРОВАТЬ: приведенный выше код будет работать только тогда, когда d находится в диапазоне от int.MinValue до int.MaxValue. Очевидно, что вы можете добиться большего успеха, чем long, но если вы хотите охватить весь диапазон decimal, вам понадобится что-то более мощное.

0 голосов
/ 02 декабря 2010

Как то так?

public static string ToSpecialFormatString(this decimal val)

  if (val == Math.Floor(val))
  {
    return val.ToString("N0");
  }
  return val.ToString("N2");
}
0 голосов
/ 02 декабря 2010

Вы должны сначала использовать метод Math.Round, а затем использовать преобразование toString ().

    //123.456 => "123.46"
    myDecimal = Math.Round(myDecimal, 2);

Вторым параметром является количество десятичных разрядов для округления до и затем вы делаете следующее:

    myDecimal.ToString(); 

На самом деле нет нужды в N2, таким образом вы отображаете числа «как есть» после округления, то есть 124, если после запятой нет десятичных дробей, или 123,46 после округления 123,456

0 голосов
/ 02 декабря 2010

Вы можете использовать "#. ##" в качестве строки формата. Итак:

123.23.ToString("#.##") => 123.23
123.00.ToString("#.##") => 123

Одно предостережение:

123.001.ToString("#.##") => 123

Но решать, приемлемо это или нет, решать вам.

0 голосов
/ 02 декабря 2010

Возможно, не идеал, но отправная точка. Просто отформатируйте до 2 десятичных знаков и замените любой .00 пустой строкой.

decimal a = 123;
decimal b = 123.4M;
decimal c = 123.456M;

Debug.Assert(a.ToString("0.00").Replace(".00", "") == "123");
Debug.Assert(b.ToString("0.00").Replace(".00", "") == "123.40");
Debug.Assert(c.ToString("0.00").Replace(".00", "") == "123.46");
...