2010-09-07 2 views
2

Просто, чтобы быть передовым, мои .net и C# expierence очень ограничены, что можно сказать, что я полный noob :) Однако у меня есть некоторое понимание ООП, как я обычно работаю в PHP (FWIW).Почему toString() заставляет мою строку потерять десятичное место?

Моя проблема, кажется, с этой линией:

Session["total"] = dt.Compute("SUM(price)", "").ToString(); 

, которые будут выводить в общей сложности сказать «9,2», где, как цена «9,20» из нескольких записей линий, как, например:

dt.Rows.Add(strRecord, 9.20, dropDownListDistrict_stepTitle.Text); 

Таким образом, 9.20 + 9.20 = "18.40", но на странице отображается "18.4".

Метка, которая отображает общую сумму является:

<asp:Label ID="labelTotal3" runat="server" Text="0" /> 

Из того, что я собрал, я страдал от какого-то проблем литья типа?

Надеюсь, я ничего не пропустил, его немного сложно показать весь код, но, надеюсь, кто-то может указать мне в правильном направлении?

Вопрос: как я могу получить дополнительное десятичное место, чтобы показать свою сумму (или почему она отбрасывает последнее десятичное место?).

ТИА Джаред

+0

Спасибо за все полезные ответы ребята! Я пробовал «N2» (и «n2»), но я получаю «метод перегрузки для toString() принимает 1 аргумент« ошибка ». Я также попробовал string.Format ("{0: C0}", labelTotal3.Text); и многочисленные вариации формирования струны, но ничего, похоже, ничего не изменило. Мне нужно написать метод перегрузки toString? :( – Jared

+0

DataTable.Compute() возвращает объект. Вероятно, вы должны его удвоить, а затем попробовать ToString. Попробуйте Session ["total"] = ((double) dt.Compute ("SUM (price)", " ")) ToString(); – Jonathan

+0

Я просто попробовал это, и это дало мне ошибку стека, поэтому я попытался сделать dt.rows.add двойным, и это не имело значения. Hmm:/ – Jared

ответ

1

Вы оценка этой проблемы является неправильным

9,20 + 9,20 = 18,4 (задний ноль будет отброшен) поэтому дисплей будет автоматически «18,4»

Попробуйте что-нибудь l икэ это

string.Format("{0:C0}", myNumber) 

Вы могли бы также пойти на самом деле фантазии и поменять символ валюты, добавить/удалить число знаков после запятой, и т.д., используя следующие функции (К сожалению, это в VB). Идея здесь заключается не в том, что она всегда применима, а просто еще один вариант, если вы ищете большую гибкость.

Public Shared Function CustomFormatCurrency(ByVal input As Decimal) As String 
    Dim nfi As System.Globalization.NumberFormatInfo = New System.Globalization.NumberFormatInfo 
    nfi.CurrencyDecimalDigits = 0 
    nfi.CurrencySymbol = "$" 
    Return String.Format(nfi, "{0:C}", input) 
End Function 
+0

Как 18.40! = 18.4 ? – BoltClock

+0

@BoltClock ... для очень малых значений 0 ... но это в стороне, я думаю, что точка, которую пыталась сделать rockinthesixstring, была: строка не является числом, а является только ее печатаемым представлением. – 2010-09-07 22:22:59

+0

@pst: lol Я знал, что это произойдет. – BoltClock

0

Ничего не теряется, поскольку 18.4 - это точно такое же, как 18.40 (к компьютеру, то есть ...). Чтобы это исправить, необходимо указать формат:

.ToString("n2"); 

Это форматирует ваше значение в виде числа с 2 цифрами справа от десятичной

3

Таким образом, 9,20 + 9,20 = «18,40», но на странице отображается «18.4».

18.4 = 18.40. Конечные нули не добавляют никакого значения в число, поэтому, если вы не попросите их распечатать, они не будут. См. String Format for Double для разных способов форматирования номера согласно вашему требованию.

0

Попробуйте ToString("##,#.##") или string.Format("{0:##,#.##}")

0

Вы хотите:

String.Format("{0:0.0}", 9.2); //9.2 
String.Format("{0:0.00}", 9.2); //9.20 
String.Format("{0:0.000}", 9.2); //9.200 
0

Я нашел в случаях прохождения классов переменных betweeen до ToString, возможно потеря есть и что ToString точна , как это обычно бывает, например, если вы хотите проверить его точность, просто разделите 10 на 3 и ToString на него, это принесет повторяющиеся десятичные знаки. Ниже приведен пример аналогичной проблемы, с которой я столкнулся, и как я работал над ней, хотя я подозреваю, что мой путь к этому моменту.

Пример

class MyDecimal 
{ 
public decimal Number = 138/10; 
} 

в других местах делают

MyDecimal ThisDec = new MyDecimal(); 
public decimal ThirdPlaceIsNoGone = ThisDec.Number/100; 

я в конечном итоге вместо деления на 100 после сбора десятичной, мне нужно разделить на 1000, вопрос посмотрел бы, что ToString понижалась 3-е место после запятой, но на самом деле его не тянули между классами, чтобы начать с

Смежные вопросы