【问题标题】:Supporting ToString(string format) with custom number type支持自定义数字类型的 ToString(字符串格式)
【发布时间】:2012-08-28 15:47:08
【问题描述】:

创建了自己的数字类型(实际上是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++)可能有帮助的东西,请告诉我。

【问题讨论】:

标签: c# string formatting tostring


【解决方案1】:

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

我想你已经知道了;不管怎样,今天我了解到如果你的DoubleDouble 类实现了IFormattable 接口,那么:

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

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

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

【讨论】:

  • 好的,我刚刚意识到 Nate 对上述问题的评论已经链接到一个很棒的教程。我的最后一段是这里唯一的新内容。
【解决方案2】:

也许这可以帮助你:

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】:

    这个过程中如何支持本地化?

    类似于以下内容:

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-01
        • 1970-01-01
        相关资源
        最近更新 更多