Нужен специальный формат валюты для использования с String.Format

Я пытаюсь использовать String.Format( "{0: c}", somevalue) в С#, но мне сложно определить, как настроить вывод для удовлетворения моих потребностей. Вот мои потребности:

  • 0 выходов в пустое
  • 1.00 выходов до $1.00
  • 10,00 выходов до $10,00.
  • 100,00 выходов до $100,00
  • 1000,00 выходов до 1000 долларов США

Я попробовал String.Format( "{0: c}", somevalue), но для нулевых значений он выдает $0.00, который я не хочу. Я также попробовал String.Format( "{0: $0,0.00; $(0,0.00); #}", somevalue), но для 1.0 он выдает $01.00. String.Format( "{0: $0.00; $(0.00); #}", somevalue) работает в большинстве случаев, но когда какое-то значение составляет 1000.00, выход составляет $1000,00.

Есть ли какой-то формат, который будет соответствовать всем 5 случаям выше? Вся документация, которую я прочитал, только детализирует основы и не затрагивает этот тип сценария.

Ответы

Ответ 1

Если вы используете

string.Format("{0:$#,##0.00;($#,##0.00);''}", value)

Вы получите "" для нулевого значения, а остальные значения должны быть отформатированы правильно.

Ответ 2

Попробуйте что-то вроде этого:

String currency = (number == 0) ? String.Empty : number.ToString("c");

Ответ 3

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

public static string ToCurrencyString (this decimal value)
{
  if (value == 0)
    return String.Empty;
  return value.ToString ("C");
}

Ответ 5

Форматы валют "C" велики, пока вам не понадобится пустое значение 0. Вот два способа, упомянутые выше, похожие на те, которые я использую, дают вам пробел для 0:

// one way
string.Format("{0:$#,##0.00;($#,##0.00);''}", somevalue)

// another way
somevalue.ToString("$#,##0.00;($#,##0.00);''")

Вторая техника чувствует себя более "бегло", если вам нравится этот стиль кода (как и я).