كيف يمكنني الجولة قيمة عشرية إلى 2 عشرية (الإخراج على الصفحة)

StackOverflow https://stackoverflow.com/questions/164926

  •  03-07-2019
  •  | 
  •  

سؤال

عند عرض قيمة عشرية حاليا مع .ToString(), إنه دقيق إلى 15 المنازل العشرية ، و أنا منذ استخدامه لتمثيل الدولارات والسنتات, أنا فقط أريد أن يكون الخرج 2 عشرية.

هل يمكنني استخدام الاختلاف من .ToString() من أجل هذا ؟

هل كانت مفيدة؟

المحلول

decimalVar.ToString ("#.##"); // returns "" when decimalVar == 0

أو

decimalVar.ToString ("0.##"); // returns "0"  when decimalVar == 0

نصائح أخرى

أعرف أن هذا هو السؤال القديم, ولكن فوجئت أن نرى أن لا أحد يبدو أن مرحلة ما بعد الإجابة على ذلك ؛

  1. لم تستخدم المصرفيين التقريب
  2. لا قيمة عشرية.

هذا ما أود أن استخدام:

decimal.Round(yourValue, 2, MidpointRounding.AwayFromZero);

http://msdn.microsoft.com/en-us/library/9s0xa85y.aspx

decimalVar.ToString("F");

هذا سوف:

  • جولة قبالة إلى 2 عشرية على سبيل المثال.23.456 => 23.46
  • التأكد من أن هناك دائما 2 عشرية على سبيل المثال.23 => 23.00, 12.5 => 12.50

مثالية العملة وعرض المبالغ النقدية.

للحصول على وثائق ToString("F"): http://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx#FFormatString (مع الشكر جون شنايدر)

إذا كنت بحاجة فقط هذا للاستخدام الشاشة string.Format

String.Format("{0:0.00}", 123.4567m);      // "123.46"

http://www.csharp-examples.net/string-format-double /

وو"م" هو لاحقة عشرية. معلومات لاحقة العشرية:

http://msdn.microsoft.com/en-us/library/ 364x0z75.aspx

نظرا عشري d=12.345; التعبيرات د.ToString("C") أو السلسلة.Format("{0:C}", د) العائد $12.35 - نلاحظ أن الثقافة الحالية العملة الإعدادات بما في ذلك الرمز تستخدم.

علما بأن "ج" يستخدم عدد من الأرقام من الثقافة الحالية.يمكنك دائما تجاوز الافتراضي إلى القوة اللازمة الدقة C{Precision specifier} مثل String.Format("{0:C2}", 5.123d).

إذا كنت ترغب في ذلك تنسيق بفواصل فضلا عن العشرية (ولكن لا رمز العملة)، مثل 3،456،789.12 ...

decimalVar.ToString("n2");

وهناك بالفعل إجابتين التهديف العالية التي تشير إلى Decimal.Round (...) ولكن أعتقد أن هناك حاجة إلى مزيد من التوضيح قليلا - لأن هناك خاصية هامة غير متوقعة من عشري التي ليست واضحة

.

وA عشري "يعرف" كم عدد المنازل العشرية أنها تستند إلى حيث أتوا.

وعلى سبيل المثال قد تكون التالية غير متوقع:

Decimal.Parse("25").ToString()          =>   "25"
Decimal.Parse("25.").ToString()         =>   "25"
Decimal.Parse("25.0").ToString()        =>   "25.0"
Decimal.Parse("25.0000").ToString()     =>   "25.0000"

25m.ToString()                          =>   "25"
25.000m.ToString()                      =>   "25.000"

والقيام بنفس العمليات مع Double سوف لا تعطي منازل عشرية ("25") لكل ما سبق.

وعندما تريد عشري إلى 2 عشريين ثيريس عن فرصة 95٪ انها لأنه العملة في هذه الحالة وربما هذا هو ما يرام ل95٪ من الوقت:

Decimal.Parse("25.0").ToString("c")     =>   "$25.00"

وأو في XAML كنت تستخدم فقط {Binding Price, StringFormat=c}

وحالة واحدة ركضت إلى حيث أنا في حاجة إلى عشري AS كان العشرية عند إرسال XML إلى خدمة ويب الأمازون. الخدمة كان يشتكي لأنه لم يتم إرسال قيمة عشرية (في الأصل من SQL Server) كما 25.1200 ورفضت، (وكان 25.12 التنسيق المتوقع).

وكل ما يلزم القيام به هو Decimal.Round(...) مع 2 عشرية لعلاج هذه المشكلة.

 // This is an XML message - with generated code by XSD.exe
 StandardPrice = new OverrideCurrencyAmount()
 {
       TypedValue = Decimal.Round(product.StandardPrice, 2),
       currency = "USD"
 }

وTypedValue هو من نوع Decimal ذلك أنا لا يمكن أن مجرد القيام ToString("N2") وهناك حاجة لجولة وابقائه كما decimal.

وهنا هو برنامج Linqpad القليل لإظهار أشكال مختلفة:

void Main()
{
    FormatDecimal(2345.94742M);
    FormatDecimal(43M);
    FormatDecimal(0M);
    FormatDecimal(0.007M);
}

public void FormatDecimal(decimal val)
{
    Console.WriteLine("ToString: {0}", val);
    Console.WriteLine("c: {0:c}", val);
    Console.WriteLine("0.00: {0:0.00}", val);
    Console.WriteLine("0.##: {0:0.##}", val);
    Console.WriteLine("===================");
}

وهنا وهنا النتائج:

ToString: 2345.94742
c: $2,345.95
0.00: 2345.95
0.##: 2345.95
===================
ToString: 43
c: $43.00
0.00: 43.00
0.##: 43
===================
ToString: 0
c: $0.00
0.00: 0.00
0.##: 0
===================
ToString: 0.007
c: $0.01
0.00: 0.01
0.##: 0.01
===================

وأيا من هذه لم بالضبط ما احتاجه، لإجبار على 2 d.p. ومحاصرة كما 0.005 -> 0.01

وإجبار 2 d.p. يتطلب زيادة الدقة بنسبة 2 d.p. لضمان لدينا على الأقل 2 d.p.

وبعد ذلك التقريب للتأكد من أننا لم يكن لديك أكثر من 2 d.p.

Math.Round(exactResult * 1.00m, 2, MidpointRounding.AwayFromZero)

6.665m.ToString() -> "6.67"

6.6m.ToString() -> "6.60"

ونادرا جدا ما كنت تريد سلسلة فارغة إذا كانت القيمة 0.

decimal test = 5.00;
test.ToString("0.00");  //"5.00"
decimal? test2 = 5.05;
test2.ToString("0.00");  //"5.05"
decimal? test3 = 0;
test3.ToString("0.00");  //"0.00"

والجواب أعلى تصنيف غير صحيحة وأضاعت 10 دقيقة من (معظم) وقت الناس.

والجواب أعلى تصنيف يصف طريقة لتنسيق <م> سلسلة تمثيل من قيمة عشرية، وأنه يعمل.

ولكن، إذا كنت فعلا تريد تغيير دقة حفظها إلى القيمة الفعلية، تحتاج إلى كتابة شيء كما يلي:

public static class PrecisionHelper
{
    public static decimal TwoDecimalPlaces(this decimal value)
    {
        // These first lines eliminate all digits past two places.
        var timesHundred = (int) (value * 100);
        var removeZeroes = timesHundred / 100m;

        // In this implementation, I don't want to alter the underlying
        // value.  As such, if it needs greater precision to stay unaltered,
        // I return it.
        if (removeZeroes != value)
            return value;

        // Addition and subtraction can reliably change precision.  
        // For two decimal values A and B, (A + B) will have at least as 
        // many digits past the decimal point as A or B.
        return removeZeroes + 0.01m - 0.01m;
    }
}

وإختبار سبيل المثال وحدة:

[Test]
public void PrecisionExampleUnitTest()
{
    decimal a = 500m;
    decimal b = 99.99m;
    decimal c = 123.4m;
    decimal d = 10101.1000000m;
    decimal e = 908.7650m

    Assert.That(a.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
        Is.EqualTo("500.00"));

    Assert.That(b.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
        Is.EqualTo("99.99"));

    Assert.That(c.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
        Is.EqualTo("123.40"));

    Assert.That(d.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
        Is.EqualTo("10101.10"));

    // In this particular implementation, values that can't be expressed in
    // two decimal places are unaltered, so this remains as-is.
    Assert.That(e.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
        Is.EqualTo("908.7650"));
}

يمكنك استخدام نظام.العولمة إلى تنسيق عدد في أي شكل.

على سبيل المثال:

system.globalization.cultureinfo ci = new system.globalization.cultureinfo("en-ca");

إذا كان لديك decimal d = 1.2300000 وتحتاج إلى تقليم إلى 2 عشرية ومن ثم يمكن طباعة مثل هذا d.Tostring("F2",ci); حيث F2 سلسلة صيغة إلى 2 عشرية و ci هو لغة أو cultureinfo.

لمزيد من المعلومات راجع هذا الرابط
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

مايك M. في الإجابة كان مثاليا بالنسبة لي على .NET ولكن صافي الأساسية لايوجد طريقة decimal.Round في وقت كتابة المقال.

في. NET الأساسية، واضطررت الى استخدام:

decimal roundedValue = Math.Round(rawNumber, 2, MidpointRounding.AwayFromZero);

وهناك طريقة hacky، بما في ذلك تحويل إلى سلسلة، هو:

public string FormatTo2Dp(decimal myNumber)
{
    // Use schoolboy rounding, not bankers.
    myNumber = Math.Round(myNumber, 2, MidpointRounding.AwayFromZero);

    return string.Format("{0:0.00}", myNumber);
}

https://msdn.microsoft. كوم / EN-US / مكتبة / dwhawy9k٪ 28V = vs.110٪ 29.aspx

وهذا رابط يشرح بالتفصيل كيف يمكنك التعامل مع مشكلتك وما يمكنك القيام به إذا كنت ترغب في معرفة المزيد. لأغراض البساطة، ما تريد القيام به هو

double whateverYouWantToChange = whateverYouWantToChange.ToString("F2");

وإذا كنت تريد هذا لعملة، يمكنك أن تجعل الأمر أكثر سهولة عن طريق كتابة "C2" بدلا من "F2"

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top