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

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

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

Ответ 1

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

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

Ответ 2

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

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/

Ответ 3

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

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, за которым следует столько нулей, сколько цифр после десятичной точки, которую вы хотели бы. Используйте имя культуры, которое необходимо настроить для результата форматирования.

Ответ 4

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

double total = "43.257"
MessageBox.Show(total.ToString("F"));

Ответ 5

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

Ответ 6

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

string prouctPrice = Convert.ToDecimal(String.Format("{0:0.00}", Convert.ToDecimal(yourString))).ToString();

Ответ 7

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

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

Ответ 8

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

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

var result2 = result1.Remove(result1.Length - 1);

Ответ 9

Я знаю, что это старый поток, но я просто должен был это сделать. В то время как другие подходы здесь работают, мне нужен простой способ повлиять на множество вызовов 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;
    }
}

Ответ 10

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

double value = 123.456789;
String.Format("{0:0.00}", value);

Ответ 11

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

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

Выход: $1.99

Ответ 12

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

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

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

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

Ответ 13

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

porcent.ToString("0.##"+"%")

Ответ 14

Решение:

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

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