我正在尝试打印Point3D列表。但是我不希望它们以最大小数位数打印。我希望能够控制它。
所以我试过
Point3D loc = new Point3D(x,y,z);
var formatter = new NumberFormatInfo();
formatter.NumberDecimalDigits = 2;
return loc.ToString(formatter);
但这不起作用,并且仍然打印了太多十进制数字。
我还想对包含双成员的其他数据结构执行相同的操作。我想解决方案是一样的。
答案 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)