2012-03-15 13 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

相關問題