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

时间:2012-08-28 15:47:08

标签: c# string formatting tostring

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

public string ToString(string format, IFormatProvider formatProvider) {
    // formatting string according to format and using formatprovider?
    return formattedString;
}

该类的用户应该能够将其用作double(或任何其他数字格式)的替代品。

String.Format("{0:0.##}", (DoubleDouble)123.4567);

我的问题是,有人知道一个关于此的好教程还是可以给我一些提示? 如何在此过程中支持本地化?

如何解析格式字符串?是否有一些方法可以帮助完成此任务,或者我必须通过“手动”使用regexp等来完成所有这些操作?

我真的寻找帮助,但找不到任何帮助,如果你发现其他语言(C,C ++)可能会有所帮助,请告诉我。

4 个答案:

答案 0 :(得分:1)

MSDN有一个nice example Temperature类,它使用自己的自定义格式实现IFormattable接口。

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

String.Format("{0:0.##}", (DoubleDouble)123.4567);

...会使用特定格式DoubleDouble作为第一个参数调用ToString(...)类的"0.##"实现,我怀疑它与您想要的一致。你仍然需要解析那部分格式。

我猜想大部分格式解析都嵌入在高度优化的.Net库二进制文件中,所以你没有得到任何自定义解析虚拟方法来帮助。

答案 1 :(得分:0)

  

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

如下所示:

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框架中没有公共API可以帮助您。如果你查看source的.NET原始数字类型的IFormattable实现,它们最终都会调用外部方法,因此它们没有提供任何见解。你可能需要使用像RegEx这样的东西来解析格式字符串。然后你可以除以10的最大功率来计算输出的第一个数字,减去它,然后重复10的较小功率,直到你产生了所有的数字。

答案 2 :(得分:0)

也许这可以帮到你:

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;
   }
}

答案 3 :(得分:0)

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

https://github.com/flamewave/jquery-ui-numeric/blob/master/jquery-ui-numeric.js

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

注意:我不再维护此功能,而是使用Globalize库,这也可以让您深入了解解析格式字符串。