С# Double - ToString() форматирование с двумя десятичными знаками, но без округления

Как отформатировать Double до String на С#, чтобы иметь только два десятичных знака?

Если я использую String.Format("{0:0.00}%", myDoubleValue), тогда число округляется, и я хочу простой усекать без округления. Я также хочу, чтобы преобразование в String было чувствительным к культуре.

+124
источник поделиться
14 ответов

Я использую следующее:

double x = Math.Truncate(myDoubleValue * 100) / 100;

Например:

Если число равно 50.947563, и вы используете следующее, произойдет следующее:

- Math.Truncate(50.947563 * 100) / 100;
- Math.Truncate(5094.7563) / 100;
- 5094 / 100
- 50.94

И там ваш ответ усечен, теперь для форматирования строки просто выполните следующее:

string s = string.Format("{0:N2}%", x); // No fear of rounding and takes the default number format
+169
источник

Следующий округляет числа, но показывает только до двух знаков после запятой (удаление любых завершающих нулей), благодаря .##.

decimal d0 = 24.154m;
decimal d1 = 24.155m;
decimal d2 = 24.1m;
decimal d3 = 24.0m;

d0.ToString("0.##");   //24.15
d1.ToString("0.##");   //24.16 (rounded up)
d2.ToString("0.##");   //24.1  
d3.ToString("0.##");   //24

http://dobrzanski.net/2009/05/14/c-decimaltostring-and-how-to-get-rid-of-trailing-zeros/

+73
источник
другие ответы

Связанные вопросы


Похожие вопросы

Я предлагаю вам сначала усечь, а затем отформатировать:

double a = 123.4567;
double aTruncated = Math.Truncate(a * 100) / 100;
CultureInfo ci = new CultureInfo("de-DE");
string s = string.Format(ci, "{0:0.00}%", aTruncated);

Используйте константу 100 для усечения двух цифр; используйте 1, за которым следует столько нулей, сколько цифр после десятичной точки, которую вы хотели бы. Используйте имя культуры, которое необходимо настроить для результата форматирования.

+31
источник

Простейший метод, используйте строки числового формата:

double total = "43.257"
MessageBox.Show(total.ToString("F"));
+14
источник

Я использую price.ToString("0.00") для получения начальных 0s

+7
источник

Это работает для меня

string prouctPrice = Convert.ToDecimal(String.Format("{0:0.00}", Convert.ToDecimal(yourString))).ToString();
+5
источник

Функция С#, выраженная Кайлом Розендо:

string DecimalPlaceNoRounding(double d, int decimalPlaces = 2)
{
    d = d * Math.Pow(10, decimalPlaces);
    d = Math.Truncate(d);
    d = d / Math.Pow(10, decimalPlaces);
    return string.Format("{0:N" + Math.Abs(decimalPlaces) + "}", d);
}
+5
источник

Как добавить один дополнительный десятичный знак, который должен быть округлен, а затем отброшен:

var d = 0.241534545765;
var result1 = d.ToString("0.###%");

var result2 = result1.Remove(result1.Length - 1);
+5
источник

Я знаю, что это старый поток, но я просто должен был это сделать. В то время как другие подходы здесь работают, мне нужен простой способ повлиять на множество вызовов string.format. Поэтому добавление Math.Truncate ко всем вызовам не было действительно хорошим вариантом. Кроме того, поскольку некоторые форматирования хранятся в базе данных, это еще хуже.

Таким образом, я создал поставщика настраиваемого формата, который позволил бы мне добавить усечение в строку форматирования, например:

string.format(new FormatProvider(), "{0:T}", 1.1299); // 1.12
string.format(new FormatProvider(), "{0:T(3)", 1.12399); // 1.123
string.format(new FormatProvider(), "{0:T(1)0,000.0", 1000.9999); // 1,000.9

Реализация довольно проста и легко распространяется на другие требования.

public class FormatProvider : IFormatProvider, ICustomFormatter
{
    public object GetFormat(Type formatType)
    {
        if (formatType == typeof (ICustomFormatter))
        {
            return this;
        }
        return null;
    }

    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
        if (arg == null || arg.GetType() != typeof (double))
        {
            try
            {
                return HandleOtherFormats(format, arg);
            }
            catch (FormatException e)
            {
                throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
            }
        }

        if (format.StartsWith("T"))
        {
            int dp = 2;
            int idx = 1;
            if (format.Length > 1)
            {
                if (format[1] == '(')
                {
                    int closeIdx = format.IndexOf(')');
                    if (closeIdx > 0)
                    {
                        if (int.TryParse(format.Substring(2, closeIdx - 2), out dp))
                        {
                            idx = closeIdx + 1;
                        }
                    }
                    else
                    {
                        throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
                    }
                }
            }
            double mult = Math.Pow(10, dp);
            arg = Math.Truncate((double)arg * mult) / mult;
            format = format.Substring(idx);
        }

        try
        {
            return HandleOtherFormats(format, arg);
        }
        catch (FormatException e)
        {
            throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
        }
    }

    private string HandleOtherFormats(string format, object arg)
    {
        if (arg is IFormattable)
        {
            return ((IFormattable) arg).ToString(format, CultureInfo.CurrentCulture);
        }
        return arg != null ? arg.ToString() : String.Empty;
    }
}
+2
источник

Следующие могут использоваться только для отображения, в котором используется свойство String..

double value = 123.456789;
String.Format("{0:0.00}", value);
+1
источник

К тому, что стоит, для отображения валюты вы можете использовать "C":

double cost = 1.99;
m_CostText.text = cost.ToString("C"); /*C: format as currentcy */

Выход: $1.99

+1
источник

Вы также можете написать свой собственный IFormatProvider, хотя я полагаю, что в конечном итоге вам придется подумать о способе сделать фактический усечение.

.NET Framework также поддерживает настраиваемое форматирование. Обычно это связано с созданием класса форматирования, который реализует как IFormatProvider, так и ICustomFormatter. (MSDN)

По крайней мере, это было бы легко повторно использовать.

Существует статья о том, как реализовать свой собственный IFormatProvider/ICustomFormatter здесь, в CodeProject. В этом случае лучшим вариантом будет "расширение" существующего числового формата. Это не выглядит слишком тяжелым.

0
источник

У меня была эта проблема с xamarin и я решил:

porcent.ToString("0.##"+"%")
0
источник

Решение:

var d = 0.123345678; 
var stringD = d.ToString(); 
int indexOfP = stringD.IndexOf("."); 
var result = stringD.Remove((indexOfP+1)+2);

(indexOfP + 1) +2 (это число зависит от количества, которое вы хотите сохранить. Я даю ему два, потому что владелец вопроса хочет.)

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос