2016-04-25 16 views
5

Mam następujący problem: Po dodać ciąg do mojego numeru drugą cyfrę po punkt znika jak tenC# Liczby po dziesiętny znika po łączę je z ciągiem

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."); 
} 

wyjście jest 37, 4, gdy powinno być 37,40 z jeszcze jedną cyfrą po przecinku. Jak mogę rozwiązać ten problem? Po wydrukowaniu bez dodania ostatniego fragmentu łańcucha wynik wartości całkowitej jest poprawny.

+0

Twój kod jest w porządku "{0: F2}" zawsze wyświetli 2 miejsca dziesiętne. Czy na pewno używasz poprawnej wersji? – CathalMF

+0

Czy sprawdzasz wartość w debugerze lub konsoli? – user1666620

+0

W konsoli. "{0: F2}" nie wyprowadza dwóch miejsc po przecinku, gdy łączę się z + "lv.", Tylko wtedy, gdy nie umieszczam niczego po nim. –

Odpowiedz

5

Jesteś nieprawidłowo formatowania strunowy. Console.Write pobiera argument łańcuchowy, a następnie opcjonalnie niektóre argumenty później, aby przejść do ciągu znaków.

W przykładzie kodu, ciąg jest

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

a następnie argument można przejść do tego łańcucha jest

needed_product + "lv." 

needed_product jest dodawany do „kal.”, Aw istocie procesu przekonwertowane na ciąg bez parametrów niestandardowych.Oznacza to, że {0:F2} zostaje przekształcona w ciąg i ignoruje modyfikator F2, dając

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

Zamiast używać

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

Ah! @Groo pokonał mnie przez 90 sekund ... – FiveThree

+2

Właściwie to oszukiwałem, ponieważ szybko napisałem pierwsze zdanie, a następnie poświęciłem czas na edycję wiadomości (masz 5 minut na jej edycję, zanim zostanie ona oznaczona jako edytowana). W każdym razie twoja odpowiedź jest dobra i szczegółowa, witaj w StackOverflow i daj mi +1. – Groo

1

Można użyć niestandardowego formatu w wywołaniu toString().

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

hes już robi to w linii pisania. – CathalMF

+0

Dlaczego **** jest to odrzucane, mimo że jest to poprawna odpowiedź? Tutaj, idź na górę! –

-2

zmiana ta

"{0:F2}" 

do

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

Zmiana "{0: F2}" na "{0: 0. ##}" nie działa z Console.WriteLine(); –

0

Będziesz rozwiązać ten problem za pomocą liczb całkowitych i liczyć centów. To jedyny właściwy sposób postępowania z walutą.

Użyj funkcji dzielonej przez 100 i formatuj na każdym wyświetlanym wydruku.

Jeśli nie masz teraz problemów z używaniem float, prędzej czy później przyjdzie.

+1

Prawdziwy, dziesiętny typ danych - łatwiejszy w obsłudze –

1

Problem polega na łączeniu wartości dziesiętnej z łańcuchem przed jego sformatowaniem.

Innymi słowy, obecny kod jest funkcjonalnie równoważne:

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

Aby to naprawić, należy po prostu włożyć jednostki do rzeczywistego ciąg formatu:

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

Jeżeli uruchomić następujące, stały kod:

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); 
    } 
} 

It produkuje prawidłową moc wyjściową:

Ivancho ma dość pieniędzy - kosztowałoby 37,40 LV.

Objaśnienie: Drugi sposób próbowali najpierw konwertuje liczbę na ciąg wewnętrznie (przy użyciu równowartość metody .ToString()), a potem stosuje formatowanie {0:F2} który stał się bezużyteczny, ponieważ liczba jest już ciąg znaków, sformatowany domyślnie.

Aby tego uniknąć, należy utworzyć pełny ciąg formatowania, a następnie dodać parametry bez modyfikacji (jak pokazano w kodzie).

+0

Dziękujemy! To wydaje się być najlepszym rozwiązaniem. –

+0

Dobrze słyszeć, proszę oznaczyć je jako odpowiedź, jeśli wszystko jest w porządku. @MartinDimitrov – Matt

Powiązane problemy