如何转换Rect ToString,同时限制小数位?

时间:2014-05-03 10:30:47

标签: c# tostring rect

是否有一个简单的格式提供程序将返回Rect结构ToString并限制小数位数?

System.Windows.Rect myRect;

如果我使用myRect.ToString(),则返回

myRect: 0.0139211136847734,0.109375,0.995359599590302,1

我想要这个,将数字限制为两位小数,但myRect.ToString("D2")不能编译

 myRect: 0.01,0.10,0.99,1

注意:我不关心舍入,舍入或截断是好的。

3 个答案:

答案 0 :(得分:1)

您可以创建一个扩展方法:

public static class RectExtensions
{
    public static string ToStringRounded(this System.Windows.Rect rect)
    {
        return string.Format("{0},{1},{2},{3}", 
            Math.Round(rect.X, 2), Math.Round(rect.Y, 2), 
            Math.Round(rect.Width, 2), Math.Round(rect.Height, 2));
    }
}

然后拨打myRect.ToStringRounded();

不要忘记包含扩展方法的命名空间

答案 1 :(得分:0)

一种可能的解决方案是实现您自己的自定义格式提供程序,以便您可以使用rect对象的标准ToString方法。为此,您需要定义一个实现IFormatProvider interfaceICustomFormatter interface的自定义格式化程序类。这样您就可以实现自己的ToString("D2")解决方案。自定义格式化程序的示例解决方案可以满足您的需求:

public class CustomRectFormat : IFormatProvider, ICustomFormatter
{
    public object GetFormat(Type formatType)
    {
        if (formatType == typeof(ICustomFormatter))
        {
            return this;
        }
        else
        {
            return null;
        }
    }

    // the custom format
    public string Format(string fmt, object arg, IFormatProvider formatProvider) 
    {
        // the method processes every part of the Rect members
        var chunk = arg.ToString();
        // skip delimiters
        if (chunk != ";")
        {
            // round doubles if possible
            Double part = 0.0;
            if (Double.TryParse(chunk, out part))
            {
                return Math.Round(part, 2).ToString();
            }
        }
        return chunk;
    }
}

使用标准Rect.ToString方法:

var rect = new Rect();
rect.X = 0.5678;
rect.Width = 1.2345;
Console.WriteLine(rect.ToString(new CustomRectFormat()));

输出符合要求:

0,57;0;1,23;0 

另一种可能的解决方案是实现您自己的Rect 包装器类。由于Rect是密封的,因此它不能被子类化,但您仍然可以创建模仿原始类的类。在本课程中,您可以使用舍入覆盖 ToString方法:

public class CustomRect
{
    private Rect rect;

    public CustomRect() : this(new Size(0.0, 0.0))
    {
    }

    public CustomRect(Size size)
    {
        rect = new Rect(size);
    }

    public Double Width
    {
        get { return rect.Width; }
        set { rect.Width = value; }
    }

    public Double X
    {
        get { return rect.X; }
        set { rect.X = value; }
    }

    public Double Y
    {
        get { return rect.Y; }
        set { rect.Y = value; }
    }

    public Double Height
    {
        get { return rect.Height; }
        set { rect.Height = value; }
    }

    public String ToString()
    {
        return String.Format("{0};{1};{2};{3}", Math.Round(rect.X, 2), Math.Round(rect.Y, 2), Math.Round(rect.Width, 2), Math.Round(rect.Height));
    }
}

班级用法:

var rect1 = new CustomRect();
var rect2 = new Rect();
rect1.X = 0.123;
rect1.Width = 3.2342342342342;
rect1.Height = 0.987234876234;
rect2.X = 0.123;
rect2.Width = 3.2342342342342;
rect2.Height = 0.987234876234;
Console.WriteLine(rect1.ToString());
Console.WriteLine(rect2.ToString());

输出是:

0,12;0;3,23;1
0,123;0;3,2342342342342;0,987234876234

此解决方案存在的问题是,您需要在自定义类的任何位置使用,而不是预定义的Rect类。


另一个好方法是创建(如@Flat Eric所建议的)一个扩展方法,为Rect类的所有对象执行此操作。这种方法的缺点是,您无需在需要时使用ToString方法。

在这种情况下,您需要确定哪种解决方案更适合您。

答案 2 :(得分:0)

这可能是一个更近期的发展,我不知道,但截至今天,这完美无缺:

$"rect={rect:F2}"

当然,较早的String.Format方法也会这样做。

String.Format("{0:F2}", rect);