簡體   English   中英

覆蓋.ToString()

[英]override .ToString()

我想覆蓋.ToString()函數,這樣每當我得到一個double時,它只輸出小數點后的5位數。

如何在覆蓋函數內部對.ToString正在處理的對象進行處理? 換句話說,我在下面的代碼中放了什么shell而不是XXX?

public override string ToString()
{
    if (XXX.GetType().Name == "Double")
        return (Math.Round(XXX, 5));
}

為什么不使用內置格式?

var pi = 3.14159265m;
Console.WriteLine(pi.ToString("N5"));
-> "3.14159"

作為參考,我喜歡John Sheehan的.NET Format String Quick Reference

你不能覆蓋不同類型的方法 - 基本上你不能停止double.ToString做它做的事情。 但是,您可以編寫一個方法,該方法采用double並對其進行適當格式化。

正如Jon指出的那樣,你無法覆蓋Double.ToString 您可以為double類型創建一個擴展方法,以幫助您執行此操作:

public static class DoubleExtensions {
   public static string ToStringWith5Digits(this double x) { ... }
}

並使用它像:

double d = 10;
string x = d.ToStringWith5Digits(); 

您可以將格式參數傳遞給Double.ToString()指定位數:

double x = 5.12345667;
string s = x.ToString("F5"); // s="5.12345", x.ToString("#.#####") also works

你不能覆蓋雙精度的ToString()函數(它是struct Double的成員函數)

你的ToString()函數屬於哪個類? 通常,您使用的類中包含私有變量。 (但也可以是構建ToString()的變量組合)

例如:(這是偽代碼)

class MyClass
{
  private double dd;
  private string prefix = "MyDouble:";
  ...
  ...
    public override string ToString()
    {
        if (dd.GetType().Name == "Double")
        return ( prefix + Math.Round(dd, 5).ToString() );
    }
}

你不能覆蓋,但你可以擴展方法

public static string ToRoundString(this double doubleValue)
{
   return Math.Round(doubleValue, 5).ToString();
}

用法

public void TestMethod()
{
   double greatValue = 3;
   string newString = greatVale.ToRoundString();
}

干杯

雖然“F5”或“#。#####”解決了原帖的細節,因為標題相當廣泛(“覆蓋.ToString()”),我想我會補充說你也可以創建一個重載ToString()的擴展方法。

因此,例如,擴展方法:

    public static string ToString(this double value, int roundTo, string roundSuffix)
    {
        string rounded = value.ToString($"#.{new String('#', roundTo)}");
        if (rounded != value.ToString())
        {
            rounded = $"{rounded}{roundSuffix}";
        }
        return rounded;
    }

如果通過將產生“5.25四舍五入”

double d = 5.2514;
string formatted = d.ToString(2, " was rounded");

或“5.2”如果通過

double d = 5.2;
string formatted = d.ToString(2, " was rounded");

(只是在關閉機會有一些奇怪的用例,有人想做那樣的事情!)

您不應該嘗試使用與內置ToString()重載之一具有相同簽名的方法來覆蓋ToString() ,但是,當IDE將看到它時,它將永遠不會調用擴展方法(請參閱如何與現有方法同名的呼叫擴展方法?詳情)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM