创建了自己的数字类型(实际上是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 ++)可能会有所帮助,请告诉我。
答案 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库,这也可以让您深入了解解析格式字符串。