2016-04-25 41 views
5

加入他們,我有以下問題:當我將字符串添加到我的電話號碼的第2位點消失這樣C#號消失後,我用繩子

var needed_product = sets * (2 * price_bananas) + 
         sets * (4 * price_eggs) + 
         sets * (0.2 * price_berries); 

var difference = Math.Abs(needed_product - amount_cash); 

if (amount_cash>=needed_product) 
{ 
    Console.Write("Ivancho has enough money - it would cost " + "{0:F2}", 
     needed_product + "lv."); 
} 

輸出是37後, 4,當它應該是37,40時,在逗號後再多一位數字。我該如何解決這個問題? 當我在不添加最後一個字符串的情況下打印它時,整數的輸出是正確的。

+0

您的代碼很好「{0:F2}」將始終輸出2個小數位。你確定你正在運行正確的構建? – CathalMF

+0

你在調試器中還是在控制檯中檢查值? – user1666620

+0

在控制檯中。當我加入+「lv。」時,「{0:F2}」不會輸出兩位小數,只有當我沒有放置任何東西時。 –

回答

5

您不正確格式化你的串。 Console.Write需要一個字符串參數,然後選擇某些參數後傳遞給字符串。

在您的示例代碼,您的字符串是

"Ivancho has enough money - it would cost " + "{0:F2}" 

,然後傳遞到該字符串參數是

needed_product + "lv." 

needed_product被添加到「LV」,並在此過程之中轉換成一個沒有你自定義參數的字符串。這意味着,{0:F2}被轉換成字符串並忽略F2修飾,給人

"Ivancho has enough money - it would cost 37.4 lv." 

相反,使用

Console.Write("Ivancho has enough money - it would cost {0:F2} lv.", needed_product); 
+0

啊! @Groo擊敗了我90秒... – FiveThree

+2

我實際上被騙了一點,因爲我很快發佈了我的第一句話,然後花時間編輯郵件(在它被標記爲已編輯之前,您有5分鐘時間來編輯它)。無論如何,你的答案是好的和詳細的,歡迎來到StackOverflow和我的+1。 – Groo

1

您可以在toString()調用中使用自定義格式。

double value = 37.4; 
    Console.WriteLine(value.ToString("0.00")); 
+0

hes已經在寫入行中這麼做了。 – CathalMF

+0

爲什麼****是低調的,儘管這是正確的答案?在這裏,請盡情享受! –

-2

改變這種

"{0:F2}" 

"{0:0.##}" 
+0

將「{0:F2}」更改爲「{0:0。##}」不適用於Console.WriteLine(); –

0

你會使用整數解決這個問題,並計算美分。這是處理貨幣的唯一正確方法。

使用除以100並在每個顯示的輸出上格式化的功能。

如果你現在使用float沒有問題,它遲早會來的。

+1

正確,或十進制數據類型 - 這更容易處理 –

1

問題在於,在格式化之前,您將十進制值與字符串連接起來。

換句話說,當前的代碼在功能上等同於:

var temp = needed_product + "lv."; // this gets formatted using default formatting 
Console.Write("Ivancho has enough money - it would cost {0:F2}", temp); 

要解決它,你應該簡單地插入單位到實際的格式字符串:

Console.Write("Ivancho has enough money - it would cost {0:F2} lv", needed_product); 
1

如果您運行下面的,固定的代碼:

void Main() 
{ 
    var sets=6; 
    var price_bananas=0.88; 
    var price_eggs=1.10; 
    var price_berries=0.37; 
    var amount_cash=40; 
    var needed_product = sets * (2 * price_bananas) + sets * (4 * price_eggs) + sets * (0.2 * price_berries); 
    var difference = Math.Abs(needed_product - amount_cash); 
    if (amount_cash >= needed_product) 
    { 
     Console.Write(
     "Ivancho has enough money - it would cost " 
     + "{0:F2} lv.", needed_product); 
    } 
} 

它產生正確的輸出:

Ivancho有足夠的錢 - 它將花費37,40 lv。

說明: 你試圖第一的另一種方式轉換爲字符串的數量在內部(通過使用.ToString()方法是等效的),再後來應用格式{0:F2}這成爲無用的,因爲數目是已經是一個字符串,由默認選項格式化。

爲了避免這種情況,請構建完整的格式化字符串,然後添加參數而不進行修改(如代碼所示)。

+0

謝謝!這似乎是最好的解決方案。 –

+0

很好聽,如果可以,請將其標記爲答案。 @MartinDimitrov – Matt