Point3D和NumberFormatInfo

时间:2012-03-15 10:03:58

标签: c#

我正在尝试打印Point3D列表。但是我不希望它们以最大小数位数打印。我希望能够控制它。

所以我试过

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

但这不起作用,并且仍然打印了太多十进制数字。

我还想对包含双成员的其他数据结构执行相同的操作。我想解决方案是一样的。

4 个答案:

答案 0 :(得分:2)

尝试指定每个坐标的格式:

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

答案 1 :(得分: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 :(得分: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);
    }
}

答案 3 :(得分: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)