8

创建了自己的数字类型(实际上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);

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

如何解析格式字符串? 是否有一些方法可以帮助完成这项任务,或者我是否必须使用正则表达式等“手动”完成这一切?

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

4

4 回答 4

1

MSDN 有一个很好的类示例,它使用自己的自定义格式Temperature实现接口。IFormattable

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

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

... 将使用特定格式作为第一个参数调用DoubleDouble类的实现,我怀疑它接近你想要的。不过,您仍然必须解析格式的那部分。ToString(...)"0.##"

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

于 2013-01-12T21:51:35.487 回答
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.
  }
}

如何解析格式字符串?是否有一些方法可以帮助完成这项任务,或者我是否必须使用正则表达式等“手动”完成这一切?

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

于 2012-08-29T04:34:24.790 回答
0

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

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

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

注意:我不再维护这个函数来支持使用Globalize库,它也可以让你对解析格式字符串有一些了解。

于 2013-10-30T17:39:31.863 回答
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;
   }
}
于 2012-11-10T06:06:50.953 回答