2012-03-15 41 views
2

我正在尝试打印Point3D的列表。但是,我不希望它们用最大数字的小数位打印。我想能够控制这一点。Point3D和NumberFormatInfo

所以,我想

Point3D loc = new Point3D(x,y,z); 
var formatter = new NumberFormatInfo(); 
formatter.NumberDecimalDigits = 2; 
return loc.ToString(formatter); 

但这并没有工作,点仍然印有太多的小数位数。

我也想对其他包含双重成员的数据结构做同样的事情。我想这个解决方案是一样的。

回答

1

下面的作品与Point3D显式接口实现为IFormattable。根据文档,这是一种用于内部使用的方法,所以您可以使用自己调用String.Format而不是依赖此点。

这里所说:

Point3D point3D = new Point3D(4.5545511, 3.14333, 9.99811); 
CultureInfo cultureInfo = CultureInfo.InvariantCulture; 
NumberFormatInfo format = new NumberFormatInfo(); 
format.NumberDecimalDigits = 1; 
string result = ((IFormattable)point3D).ToString("n",format); 
//Outputs: "4.6,3.1,10.0" 
2

试图指定格式为每一个坐标:

return loc.x.ToString(formatter) + "" + loc.y.ToString(formatter) + "" + loc.z.ToString(formatter) 
+1

这正是我想避免的。如果我每次想要打印一个点时最终都明确地实现它,那么为Point3D使用ToString()会有什么意义? – Dina 2012-03-15 10:58:44

0

你应该尝试

Point3D loc = new Point3D(x, y, z); 

var formatter = new NumberFormatInfo(); 
formatter.NumberDecimalDigits = 2; 

return loc.ToString(null, formatter); 

它采用this重载方法。不幸的是,我无法测试这个代码。另一种方法是创建一个包含所有格式信息的自定义格式器类,因为一旦实例化后,可以为多个对象调用格式化函数。我建议你不要像这样重载类型,因为它们(并且应该保留)plain data objects

class Point3DFormatter 
{ 
    public string Point3DFormat { get; set; } 

    public Point3DFormatter() 
    { 
     Point3DFormat = "{0:0.00} {0:0.00} {0:0.00}"; 
    } 

    string Format(Point3D point) 
    { 
     return string.Format(Point3DFormat, point.X, point.Y, point.Z); 
    } 
} 
0

这是我现在已经使用了很长时间的风格,而且运作良好:通过使用

public struct Point3D : IFormattable 
{ 
    public static string DefaultFormat = "F3"; 
    public float x,y,z; 
    public string ToString(string format, IFormatProvider formatProvider) 
    { 
     string fmt = "({0:#},{1:#},{2:#})".Replace("#", format); 
     return string.Format(formatProvider, fmt, x, y, z); 
    } 

    public string ToString(string format) 
    { 
     return ToString(format, null); 
    } 
    public override string ToString() 
    { 
     return ToString(DefaultFormat); 
    } 
} 

    static void Main(string[] args) 
    { 
     Point3D A = new Point3D() { x = (float)Math.PI, y = (float)(-4/Math.PI), z = (float)(0.005 * Math.PI) }; 

     Debug.WriteLine(A.ToString()); 
     Debug.WriteLine(A.ToString("F2")); 
    } 

打印出以下

(3.142,-1.273,0.016) 
(3.14,-1.27,0.02) 
+0

OP显然试图使用WPF'Point3D'结构,而不是写一个新的:-) – 2012-03-15 19:00:21

+0

然后应该被标记为这样。在任何情况下,他都可以使用'string.Format(formatProvider,fmt,x,y,z);'函数来执行其字符串转换的结构。 – ja72 2012-03-15 19:14:30