将自定义格式字符串添加到可用的标准字符串

本文关键字:字符串 标准 添加 自定义 格式 | 更新日期: 2023-09-27 18:37:18

C, E, F, G, X的值属于标准格式字符串。 我想添加另一个标准字符串...也许字母"M"可以扩展我的货币格式选项。 我创建了一个MoneyFormatInfo类来实现必要的IFormatProviderICustomFormatter接口。 它适用于我能炮制的所有场景,除了这个......

decimal cash = 3124.728m;
//Code '392' is JAPANESE YEN, with basic French formatting.
var frenchmen = new MoneyFormatInfo("392", new CultureInfo("fr-FR"));
result = cash.ToString("m", frenchmen);
Assert.AreEqual(result, "3 124,73 JPY");

我收到的错误消息是"用户代码未处理格式异常"。

我已经反映了BCL ToString方法。 我看到它只咨询标准格式字符串的列表; 我没有看到任何钩点可以让我解决这个问题。 我错过了什么吗?

以下是当前按预期工作的其他示例...

//Code '978' is the Euro
//The custom "Money" class holds an amount and currency type which
//intentionally cannot be overridden.
Money dough = new Money(8124.348m, "978");
decimal cash = 3124.728m;
string result;
//EURO currency parameters, with basic French formatting
var french = new CultureInfo("fr-FR");
result = String.Format(french, "the money: {0:m}", dough);
Assert.AreEqual(result, "the money: 8 124,35 EUR");
//JAPANESE YEN, with basic French formatting.
var frenchmen = new MoneyFormatInfo("392", new CultureInfo("fr-FR"));
result = String.Format(frenchmen, "the cash: {0:m}", cash);
Assert.AreEqual(result, "the cash: 3 124,73 JPY");
result = dough.ToString("c", frenchmen);
Assert.AreEqual(result, "8 124,35 €");

我的自定义Money类有一个 ToString() 覆盖,它执行状态更改,并将"M"格式字符串转换为"C"。 简而言之,它之所以有效,是因为我可以控制 ToString() 方法。 在 BCL 十进制类型上,我无法控制 ToString() 方法。 我也不想创建自定义十进制类型。

将自定义格式字符串添加到可用的标准字符串

我认为

您可以自定义标准格式的出现方式,但不能实现新的标准格式字符。

class Program
{
   static void Main(string[] args)
   {
      decimal cash = 3124.728m;
      Console.WriteLine("Result: {0}", cash.ToString("C",
         new MoneyFormatInfo("JPY", new System.Globalization.CultureInfo("fr-FR"))));
   }
}
class MoneyFormatInfo : IFormatProvider
{
   System.Globalization.NumberFormatInfo numberFormat;
   public MoneyFormatInfo(string currencyCode, System.Globalization.CultureInfo culture)
   {
      numberFormat = culture.NumberFormat;
      numberFormat.CurrencySymbol = currencyCode;
   }
   public object GetFormat(Type formatType)
   {
      return numberFormat;
   }
}

请注意,您仍将使用"C"格式代码来设置货币值的格式,但您可以使用格式提供程序控制货币符号。

让我们检查一下您可以轻松阅读的代码

result = cash.ToString("m");

result = cash.ToFrenchCurrencyString();

任何开发人员(即使是一段时间后的你)阅读第一个示例都会花费相当多的时间来了解这段代码的作用和方式。第二个更容易理解,您只需按 F12 即可查看它的源代码。所以,我想制作扩展方法并将您的格式化逻辑放入其中更有用。