منسق العملة .NET:هل يمكنني تحديد استخدام التقريب المصرفي؟
-
02-07-2019 - |
سؤال
هل يعرف أحد كيف يمكنني الحصول على سلسلة تنسيق لاستخدامها تقريب المصرفيين؟لقد كنت أستخدم "{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();