.NET Currency到字符串,如果值为<;1.

.NET Currency到字符串,如果值为<;1.,.net,string-formatting,currency,.net,String Formatting,Currency,我有个问题。如果十进制数小于1,则找不到将十进制数转换为不带前导零的货币字符串的格式 e、 g 是否有一些特殊的精度说明符可以通过调用ToString来丰富这种效果?试试以下方法: string result = String.Format("{0:#.0}", d); 来源:如果您想考虑文化,您需要使用提供的信息。下面是一个扩展方法,用于将十进制数格式化为货币,但不带前导零。如果不想使用扩展方法,可以轻松地将扩展方法更改为普通方法 代码中有一个“快捷方式”。它无法处理多个组大小。我不认为使用

我有个问题。如果十进制数小于1,则找不到将十进制数转换为不带前导零的货币字符串的格式

e、 g

是否有一些特殊的精度说明符可以通过调用ToString来丰富这种效果?

试试以下方法:

string result = String.Format("{0:#.0}", d);

来源:

如果您想考虑文化,您需要使用提供的信息。下面是一个扩展方法,用于将十进制数格式化为货币,但不带前导零。如果不想使用扩展方法,可以轻松地将扩展方法更改为普通方法

代码中有一个“快捷方式”。它无法处理多个组大小。我不认为使用自定义数字格式可以做到这一点,唯一可行的解决方案是使用
N
格式化并删除任何前导的
0

static class DecimalExtensions {

  public static String ToCurrencyFormat(this Decimal value) {
    return ToCurrencyFormat(value, CultureInfo.CurrentCulture);
  }

  public static String ToCurrencyFormat(this Decimal value, CultureInfo cultureInfo) {
    return ToCurrencyFormat(value, cultureInfo.NumberFormat);
  }

  public static String ToCurrencyFormat(this Decimal value,
                                        NumberFormatInfo numberFormat) {
    // Assume the CurrencyGroupSizes contains a single element.
    var format =
      "#,"
      + new String('#', numberFormat.CurrencyGroupSizes[0])
      + "."
      + new String('0', numberFormat.CurrencyDecimalDigits);
    var formattedValue = Math.Abs(value).ToString(format, numberFormat);
    if (value >= Decimal.Zero)
      return FormatPositiveCurrency(
        numberFormat.CurrencyPositivePattern,
        numberFormat.CurrencySymbol,
        formattedValue
      );
    else
      return FormatNegativeCurrency(
        numberFormat.CurrencyNegativePattern,
        numberFormat.CurrencySymbol,
        formattedValue
      );
  }

  static String FormatPositiveCurrency(Int32 pattern, String symbol, String value) {
    switch (pattern) {
      case 0:
        return symbol + value;
      case 1:
        return value + symbol;
      case 2:
        return symbol + " " + value;
      case 3:
        return value + " " + symbol;
      default:
        throw new ArgumentException();
    }
  }

  static String FormatNegativeCurrency(Int32 pattern, String symbol, String value) {
    switch (pattern) {
      case 0:
        return "(" + symbol + value + ")";
      case 1:
        return "-" + symbol + value;
      case 2:
        return symbol + "-" + value;
      case 3:
        return symbol + value + "-";
      case 4:
        return "(" + value + symbol + ")";
      case 5:
        return "-" + value + symbol;
      case 6:
        return value + "-" + symbol;
      case 7:
        return value + symbol + "-";
      case 8:
        return "-" + value + " " + symbol;
      case 9:
        return "-" + symbol + " " + value;
      case 10:
        return value + " " + symbol + "-";
      case 11:
        return symbol + " " + value + "-";
      case 12:
        return symbol + " -" + value;
      case 13:
        return value + "- " + symbol;
      case 14:
        return "(" + symbol + " " + value + ")";
      case 15:
        return "(" + value + " " + symbol + ")";
      default:
        throw new ArgumentException();
    }
  }

}

这不会为您提供当前区域性的货币符号。此代码假定货币符号始终放在以空格分隔的数字前面。这不是对所有区域性都有效,例如
12.34M.ToString(“C”,new CultureInfo(“ru”))
返回
12,34ö.
.Hm。。我原以为会有轻松的决定,但我明白了that@Martin利弗塞奇:我以为这就是OP想要的。此外,您的解决方案在货币符号和十进制数字之间没有空格。@PaoloMoretti:您的解决方案可能是这个问题的一个很好的解决方案。从
CurrentCulture
中提取货币符号,并假设cultura是
en US
继续使用它,这似乎有点奇怪。如果事实上
CurrentCulture
ru
(俄语),那么货币符号将是
П。
(我认为是西里尔字母),然后您应该将其放在数字后面,不带前导空格。看看我对如何实现这一目标的一般(也许是过度设计的)解决方案的回答。@Martin Liversage我明白你的意思,你的解决方案肯定更完整、更正确。顺便问一下,如果语言文本方向是从右向左,您确定它有效吗?
decimal d = 0.14M;
var cs = CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol;
string result = String.Format(String.Concat("{0:", cs, " #.00}"), d);
// result == "$ .14" if CurrentCulture is "en-US"
static class DecimalExtensions {

  public static String ToCurrencyFormat(this Decimal value) {
    return ToCurrencyFormat(value, CultureInfo.CurrentCulture);
  }

  public static String ToCurrencyFormat(this Decimal value, CultureInfo cultureInfo) {
    return ToCurrencyFormat(value, cultureInfo.NumberFormat);
  }

  public static String ToCurrencyFormat(this Decimal value,
                                        NumberFormatInfo numberFormat) {
    // Assume the CurrencyGroupSizes contains a single element.
    var format =
      "#,"
      + new String('#', numberFormat.CurrencyGroupSizes[0])
      + "."
      + new String('0', numberFormat.CurrencyDecimalDigits);
    var formattedValue = Math.Abs(value).ToString(format, numberFormat);
    if (value >= Decimal.Zero)
      return FormatPositiveCurrency(
        numberFormat.CurrencyPositivePattern,
        numberFormat.CurrencySymbol,
        formattedValue
      );
    else
      return FormatNegativeCurrency(
        numberFormat.CurrencyNegativePattern,
        numberFormat.CurrencySymbol,
        formattedValue
      );
  }

  static String FormatPositiveCurrency(Int32 pattern, String symbol, String value) {
    switch (pattern) {
      case 0:
        return symbol + value;
      case 1:
        return value + symbol;
      case 2:
        return symbol + " " + value;
      case 3:
        return value + " " + symbol;
      default:
        throw new ArgumentException();
    }
  }

  static String FormatNegativeCurrency(Int32 pattern, String symbol, String value) {
    switch (pattern) {
      case 0:
        return "(" + symbol + value + ")";
      case 1:
        return "-" + symbol + value;
      case 2:
        return symbol + "-" + value;
      case 3:
        return symbol + value + "-";
      case 4:
        return "(" + value + symbol + ")";
      case 5:
        return "-" + value + symbol;
      case 6:
        return value + "-" + symbol;
      case 7:
        return value + symbol + "-";
      case 8:
        return "-" + value + " " + symbol;
      case 9:
        return "-" + symbol + " " + value;
      case 10:
        return value + " " + symbol + "-";
      case 11:
        return symbol + " " + value + "-";
      case 12:
        return symbol + " -" + value;
      case 13:
        return value + "- " + symbol;
      case 14:
        return "(" + symbol + " " + value + ")";
      case 15:
        return "(" + value + " " + symbol + ")";
      default:
        throw new ArgumentException();
    }
  }

}