由于我们使用的FCL(Framework Class Library)是由微软开发人员写出来的。大部分规则默认都是符合欧洲人习惯的。就像数字的格式化。但这个默认规则在我们中国用着实在是不爽。
比如:123,456,789会英语的都知道,Hundred、Thousand、Million和Billion,都是三位三位的分隔。但是我们中国人的习惯是四位,我们没必要这点儿东西也学人家的吧。但是.NET 里面 默认就是这样进行分隔的。这个时候来让我们一步一步的将这个默认规则给改成符合我们中国人习惯的格式。好吧,开始。。。
以下会用到两个命名空间:
System.Globalization;
System.Threading;
首先从以下这个类开始:
// 摘要: // 提供有关特定区域性的信息(对于非托管代码开发,则称为“区域设置”)。这些信息包括区域性的名称、书写系统、使用的日历以及对日期和排序字符串的格式化设置。 [Serializable] [ComVisible(true)] public class CultureInfo : ICloneable, IFormatProvider
在这个类内部可以获取当前区域默认使用的日历、获取可以使用的日历列表、当前区域的语言文化以及对当前区域使用的数字、货币、百分比格式化等;但是我们主要使用的是最后一项,该项使用了CultureInfo的一个属性。这个属性的类型为NumberFormatInfo,MSDN上的解释是:“根据区域性定义如何设置数值格式以及如何显示数值。”,它就是对当前区域的数字、货币、百分比进行格式化设置。这个类的结构视图如下:
下面讲一下使用:
比如有一个数字-1234567如果使用默认的格式化
Console.WriteLine((-1234567).ToString("N"));
结果:-1,234,567
这个时候我先获取当前区域的信息
var culture = CultureInfo.GetCultureInfo("zh-cn").Clone() as CultureInfo; if (culture == null) return;
我们看到上图一个属性、属性和属性这三个属性分别对应着:获取或设置数值中小数点左边每一组的位数。获取或设置货币值中小数点左边每一组的位数。获取或设置百分比值中小数点左边每一组的位数。只举一个例子后者使用一样:
culture.NumberFormat.CurrencyGroupSizes = new int[] { 4 };
这句是设置货币值每4位数字进行分隔,这才符合我们中国人的习惯。
此时还可以再设置每4位分隔时使用什么符,那就是使用另外一个属性进行设置了:
culture.NumberFormat.CurrencyGroupSeparator = "_";
这里我使用了一个下划线,其实使用空格比较合适,只是为了方便阅读。
然后将当前区域的设置信息赋值给当前线程的区域信息。
Thread.CurrentThread.CurrentCulture = culture;
这个时候运行程序我们将会看到想要的效果,如下
NumberFormatInfo类还可以设置小数点保留几位及负数的显示格式等。就不一一说了。这个东西很简单大家一看就明白。
最后贴出来源码:
var culture = CultureInfo.GetCultureInfo("zh-cn").Clone() as CultureInfo; if (culture == null) return; culture.NumberFormat.CurrencyGroupSizes = new int[] { 4 }; culture.NumberFormat.CurrencyGroupSeparator = "_"; Thread.CurrentThread.CurrentCulture = culture; Console.WriteLine((-1234567).ToString("N")); Console.ReadKey(true);