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



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



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

699   13  

13 ответов:

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

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/

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

выход: .99

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

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

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

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

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

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

Comments

    Ничего не найдено.