منسق العملة .NET:هل يمكنني تحديد استخدام التقريب المصرفي؟

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

سؤال

هل يعرف أحد كيف يمكنني الحصول على سلسلة تنسيق لاستخدامها تقريب المصرفيين؟لقد كنت أستخدم "{0:c}" ولكن هذا لا يتم تقريبه بنفس الطريقة التي يستخدمها التقريب المصرفي.ال Math.Round() طريقة تقريب المصرفيين.أنا فقط بحاجة إلى أن أكون قادرًا على تكرار كيفية التقريب باستخدام سلسلة تنسيق.


ملحوظة: كان السؤال الأصلي مضللاً إلى حد ما، والإجابات التي تذكر التعبير العادي مستمدة من ذلك.

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

المحلول

ألا يمكنك ببساطة استدعاء Math.Round() على إدخال السلسلة للحصول على السلوك الذي تريده؟

بدلاً من:

string s = string.Format("{0:c}", 12345.6789);

يفعل:

string s = string.Format("{0:c}", Math.Round(12345.6789));

نصائح أخرى

Regexp هي لغة مطابقة للنمط.لا يمكنك إجراء العمليات الحسابية في Regexp.

قم ببعض التجارب باستخدام IFormatProvider وICustomFormatter.وهنا رابط قد يوجهك في الاتجاه الصحيح. http://codebetter.com/blogs/david.hayden/archive/2006/03/12/140732.aspx

هذا غير ممكن، فالتعبير العادي لا يحتوي على أي مفهوم لـ "الأرقام".يمكنك استخدام أ مقيم المباراة ولكنك ستضيف كود C# الحتمي، وسوف تبتعد عن متطلبات regex الخاصة بك فقط.

لقد قام .Net ببناء دعم لكل من التقريب الحسابي والمصرفي:

//midpoint always goes 'up': 2.5 -> 3
Math.Round( input, MidpointRounding.AwayFromZero );

//midpoint always goes to nearest even: 2.5 -> 2, 5.5 -> 6
//aka bankers' rounding
Math.Round( input, MidpointRounding.ToEven );

التقريب "إلى" هو في الواقع الإعداد الافتراضي، على الرغم من أن "بعيدًا عن الصفر" هو ما تعلمته في المدرسة.

وذلك لأن معالجات الكمبيوتر الموجودة تحت الغطاء تقوم أيضًا بتقريب المصرفيين.

//defaults to banker's
Math.Round( input );

كنت أعتقد أن أي سلسلة تنسيق تقريب ستكون افتراضية لتقريب المصرفيين، أليس هذا هو الحال؟

إذا كنت تستخدم ‎.NET 3.5، فيمكنك تحديد طريقة ملحقة لمساعدتك في القيام بذلك:

public static class DoubleExtensions
{
    public static string Format(this double d)
    {
        return String.Format("{0:c}", Math.Round(d));
    }
}

وبعد ذلك، عند الاتصال به، يمكنك القيام بما يلي:

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