C# Point3D和NumberFormatInfo

C# Point3D和NumberFormatInfo,c#,C#,我正在尝试打印Point3D的列表。但是,我不希望它们被打印成最大数量的十进制数字。我希望能够控制这一切 所以我试过了 Point3D loc = new Point3D(x,y,z); var formatter = new NumberFormatInfo(); formatter.NumberDecimalDigits = 2; return loc.ToString(formatter); 但这不起作用,点上的小数位数仍然太多 对于包含双成员的其他数据结构,我也希望这样做。我想答案是一

我正在尝试打印Point3D的列表。但是,我不希望它们被打印成最大数量的十进制数字。我希望能够控制这一切

所以我试过了

Point3D loc = new Point3D(x,y,z);
var formatter = new NumberFormatInfo();
formatter.NumberDecimalDigits = 2;
return loc.ToString(formatter);
但这不起作用,点上的小数位数仍然太多


对于包含双成员的其他数据结构,我也希望这样做。我想答案是一样的。

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

return loc.x.ToString(formatter) + "" + loc.y.ToString(formatter) + "" + loc.z.ToString(formatter) 
你应该试试

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

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

return loc.ToString(null, formatter);
它使用重载方法。不幸的是,我无法测试这段代码来确定。另一种方法是拥有一个包含所有格式化信息的自定义格式化程序类,因为一旦实例化,您可以为多个对象调用格式化函数。我建议您不要像这样重载类型,因为它们是(并且应该保留)


这是我使用了很长时间的样式,效果很好:

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)

下面使用
IFormattable
的显式接口实现来处理
Point3D
。根据文档,这是一种供内部使用的方法,因此您最好使用点的坐标自己调用
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"

这正是我想要避免的。如果每次打印点时都显式地实现ToString(),那么为Point3D创建ToString()有什么意义呢?OP显然是在尝试使用WPF
Point3D
struct,而不是编写一个新的:-)然后应该这样标记is。在任何情况下,他都可以使用
string.Format(formatProvider,fmt,x,y,z)函数来执行结构到字符串的转换。
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"