在大型Web应用程序中一致地格式化C#中的字符串

时间:2008-11-16 21:49:10

标签: c# .net asp.net architecture formatting

我正在寻找一种一致的方法来构建我在大型Web应用程序中使用格式化字符串的方法,而我正在寻找建议或最佳实践。

到目前为止,我已经有了一个静态类,可以进行一些常见的格式化,例如。

Formatting.FormatCurrency

Formatting.FormatBookingReference

我不相信这是可行的方法,我更喜欢直接使用.NET中格式化字符串的标准方法并使用:

amount.ToString( “C”)

reference.ToString( “000000”)

Id使用IFormattable和ICustomFormatter来处理一些更复杂的数据结构,但是我正在努力解决我们需要格式化的更简单的现有对象(在这种情况下是Int32但也是DateTime)。

我是否只是为“c”和“000000”定义常量,并在整个网络应用程序中一致地使用它们,还是有更标准的方法来实现它?

3 个答案:

答案 0 :(得分:12)

一种选择是使用带有扩展方法的辅助类,如

public static class MyWebAppExtensions
{
    public static string FormatCurrency(this decimal d)
    {
        return d.ToString("c");
    }
}

然后你在任何地方都有一个十进制值

Decimal d = 100.25;
string s = d.FormatCurrency();

答案 1 :(得分:5)

我同意GeekyMonkey的建议,但有一处改动:

格式化是一个实现细节。我建议ToCurrencyString遵守To *惯例及其意图。

答案 2 :(得分:2)

这个答案可以与GeekyMonkey的答案结合起来。

首先,在ASP.NET中,您可以使用globalization元素在web.config中设置文化和UI文化。当您有特殊的格式需求时,resourceProviderFactoryType属性就是您的朋友。

另一种可能性是创建ASP.NET Page类的子类并覆盖InitializeCulture方法。在这里,您可以更改存储在处理HTTP请求的当前线程中的文化和UI文化。

一个简单的例子:

protected override void InitializeCulture()
{
    Thread.CurrentThread.CurrentCulture = ...;
    Thread.CurrentThread.CurrentUICulture = ...;

    Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd-MM-yyyy";
    ...
}

对于那些担心ASP.NET进行“随机”线程切换的人:

  

ASP.NET确保即使它们切换您的线程,原始线程中的CurrentPrincipal和culture属性也会转移到新线程。这是自动的,您无需担心丢失这些值。呼!

     

来源:ASP.NET thread switching