是否有一个简单的格式提供程序将返回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
注意:我不关心舍入,舍入或截断是好的。
答案 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 interface和ICustomFormatter 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);