C# 支持自定义数字类型的ToString(字符串格式)

C# 支持自定义数字类型的ToString(字符串格式),c#,string,formatting,tostring,C#,String,Formatting,Tostring,创建了自己的数字类型(实际上是DoubleDouble),我想实现IFormattable接口。所以我必须以某种方式解析格式字符串 public string ToString(string format, IFormatProvider formatProvider) { // formatting string according to format and using formatprovider? return formattedString; } 该类的用户应该能够使

创建了自己的数字类型(实际上是
DoubleDouble
),我想实现
IFormattable
接口。所以我必须以某种方式解析格式字符串

public string ToString(string format, IFormatProvider formatProvider) {
    // formatting string according to format and using formatprovider?
    return formattedString;
}
该类的用户应该能够使用它来替代
双精度
(或任何其他数字格式)

我的问题是,有人知道这方面的好教程吗,或者能给我一些提示吗? 如何在此过程中支持本地化

如何解析格式字符串?是否有一些方法可以帮助完成这项任务,或者我必须用regexp之类的工具“手工”完成这项任务

我真的在寻找帮助,但找不到任何帮助,如果你在另一种语言(C,C++)中找到可能有帮助的东西,请告诉我

如何在此过程中支持本地化

如下所示:

public string ToString(string format, IFormatProvider formatProvider)
{
  CultureInfo culture = formatProvider as CultureInfo;
  if (culture != null)
  {
    // Now you can do things like 
    // culture.NumberFormat.NumberDecimalSeparator, etc.
  }
}
如何解析格式字符串?在这方面有什么方法可以帮助你吗 任务还是我必须用regexp之类的工具“手工”完成


在.NET framework中没有公共API可以为您执行此操作。如果您查看.NET原语数值类型的
IFormattable
实现,它们最终都会调用外部方法,因此无法提供洞察。您可能需要使用类似RegEx的东西来解析格式字符串。然后,您可以除以
10的最大幂,计算出输出的第一个数字是什么,减去它,然后重复
10的较小幂,直到生成所有数字。

也许这可以帮助您:

var my = DoFormat(123.0)

public static string DoFormat( double myNumber )
{

    var s = string.Format("{0:0.00}", myNumber);

    if ( s.EndsWith("00") )
    {
        return ((int)myNumber).ToString();
    }
    else
    {
        return s;
   }
}
MSDN有一个
Temperature
类,该类使用自己的自定义格式实现
IFormattable
接口

我想你已经知道了;无论如何,今天我了解到,如果您的
DoubleDouble
类实现了
IFormattable
接口,那么:

String.Format("{0:0.##}", (DoubleDouble)123.4567);
。。。将调用
DoubleDouble
类的
ToString(…)
实现,具体格式为
“0.##”
,作为第一个参数,我怀疑这与您想要的非常接近。不过,您仍然需要解析格式的这一部分


我猜大部分格式解析都深入到高度优化的.Net库二进制文件中,因此没有任何自定义的解析虚拟方法提供帮助。

几年前我编写了一个JavaScript数字格式化函数,它模仿了大多数.Net格式字符串解析方法。这可能会对你写C版本的书有所帮助。至少它可以给你一个起点

一直向下滚动到底到$.formatNumber函数


注意:为了使用库,我不再维护此函数,这也可能会让您对解析格式字符串有一些了解。

在开始使用自定义类型之前,我会先从标准字符串开始。本地化呢?我发现这非常有用——我已经有了一个返回科学符号的ToString方法。我面临的问题是,如何解析格式字符串并返回相应的数字。给定的链接只使用了非常基本的修饰语。好吧,我刚刚意识到Nate对上述问题的评论已经链接到了一个很棒的教程。我的最后一段是这里唯一的新东西。
String.Format("{0:0.##}", (DoubleDouble)123.4567);