2011-06-16 22 views
4

在將十進制轉換爲字符串時,我嘗試了兩種方法。C#.Net中將十進制轉換爲字符串時的問題

方法1:

string a = "100.00", b = "50.00"; 
    string Total = (string)(Convert.ToDecimal(a) + Convert.ToDecimal(b)); 

它拋出錯誤,不能轉換十進制轉換爲字符串。

方法2:

string Total = (Convert.ToDecimal(a) + Convert.ToDecimal(b)).ToString(); 

它不會引發錯誤,這是工作的罰款。

我想知道這兩種轉換方法之間的區別,以及爲什麼當我使用方法1時拋出錯誤?

回答

9

第一種方法是嘗試取小數(加上2位小數的結果)並將其轉換爲字符串。由於不存在(從十進制到字符串的隱式或顯式轉換),因爲不匹配而拋出。

第二個需要一個小數,並在其上調用ToString()方法 - 因爲ToString是十進制類型的有效方法,所以這會調用一個普通的實例方法調用,並獲得該調用的返回值,即一個字符串。

由於您已經使用了Convert調用,因此可能會發現使用Convert.ToString將decimal轉換爲字符串更自然。

如果將「添加兩位小數」分隔爲單獨的本地變量,可能會更加清楚,因爲這對於這兩者都是通用的。

因此,(註釋掉的)total1失敗是因爲它試圖投射,而我們沒有可用的轉換。後兩者都可以正常工作,因爲它們是返回字符串的方法調用。

string a = "100.00", b = "50.00"; 
decimal result = Convert.ToDecimal(a) + Convert.ToDecimal(b); 
//string total1 = (string)result; 
string total2 = result.ToString(); 
string total3 = Convert.ToString(result); 
1

在第一種方法是你基本上做

string a = (string)150m; 

其中150是小數。從小數到字符串沒有明確或隱含的轉換。編譯器不會理解如何進行轉換。

在第二種方法調用

string a = 150m.ToString(); 

在這種情況下,你在呼喚ToString方法Decimal類工具(連同所有其他類)。

1

第一個代碼嘗試將「十進制」轉換爲字符串,其中第二個代碼調用十進制的ToString方法以獲取十進制的字符串表示形式。類型從十進制轉換爲字符串將不起作用,除非十進制類型重載類型轉換運算符,因此類型轉換會拋出異常。

在這種情況下類型轉換就像是要求CLR系統鍵入一個十進制字符串,這是CLR無法做到的,因爲它沒有找到辦法做到這一點。 調用ToString要求十進制類型返回其字符串表示

1

Method1是一個強制轉換,因此您試圖將包含在十進制變量中的數據作爲字符串「讀取」......當然,您不能。例如,可以將一個字節強制轉換爲int,因爲它們都是數字。取而代之的是十進制字符串,你需要一個顯式的轉換程

1

它的原因是在第一種方法中,您將字符串a和b轉換爲十進制,但在您只是將類型轉換爲字符串時,需要將該十進制值轉換爲字符串,然後再將其分配給字符串變量。 在第二種方法中,您實際上是通過使用ToString()方法將十進制值轉換爲字符串,所以它不會給出錯誤。

1

這裏是表的鏈接,說,你不能轉換十進制到字符串作爲你的第一種方法做:

Explicit Numeric Conversions Table (C# Reference)

第二種方法是工作,因爲你正在使用對象的ToString()方法類。

+0

nit-pick,但雖然System.Object定義ToString()(顯然),但實際使用的實現是在System.Decimal中創建的重寫。如果不這樣做,結果將會是一個像「System.Decimal」這樣的字符串,因爲對象ToString()會打印出類型名稱。 – 2011-06-16 05:29:48

+0

@詹姆斯曼寧 - 感謝信息先生.... – 2011-06-16 05:37:37

相關問題