C# 格式化输出

    今天刚学C#,写下我的第一个程序:

class Program{
   public static void Main(String[] args){
      Console.WriteLine(10.0);
   }
}

    作为一名java程序员,C#的写法是有点差异,常用的System.out.println()被替换成:Console.WriteLine(),而且C#的规范要求方法的首字母大写,但在java中这是类的命名规则。
     这些都是小问题,很快就习惯了,但我一运行这个代码,就发现我的输出变成了:10!

     原来,在C#这里,10.0会当成10来处理,如果我们想要正确的输出10.0,就要利用格式化输出,像是下面这样:

Console.WriteLine("{0:N1}", 10.0);

     我们还可以这样写(这样麻烦了点):

Console.WriteLine(String.Format("{0:N1}", 10.0));

    甚至我们还可以这样写;

double d = 10;
Console.WriteLine(d.ToString("N2");

    前面两种写法的第一个参数"{0:N1}"表示后面的第一个参数,就是10.0,取小数后一位,如果想取两位,可以将1改为2。后面一种说明,在C#中,double本身就是一种对象类型,因为它拥有方法。事实上,在C#中,所有的类型,值类型和引用类型继承自System.Object这个基类(看到Object,我这个java人可是亲切得很,但也被C#的这种特点吓到了~~才怪,javascript已经让我对这种情况没有什么感觉了---函数都是对象!)。

     当然,它可以处理更多的参数,像是这样:

Console.WriteLine("I love {0}, you love {1}", "you", "me");

     而且我们还能以科学计数法的格式输出:

Console.WriteLine("{0:E2}", 100);

    输出结果就是:1.00E+002.

    格式化输出还有更加神奇的地方:它允许一个格式项有多种格式选择:

Console.WriteLine("{0:#,###0.00;#,###0.000;#,###0.0000}",10);
Console.WriteLine("{0:#,###0.00;#,###0.000;#,###0.0000}", -10);
Console.WriteLine("{0:#,###0.00;#,###0.000;#,###0.0000}", 0));

   神奇的是,这种格式具有选择性,第一种格式对应的是正数,第二种对应的是负数,第三种对应的是0,后面的参数会根据自身情况,选择相应的格式。

   格式化的内容很多,涉及到日期,货币等等,这些都是在需要用到的时候才会接触,所以,这里就不详谈。上面的问题其实很简单,因为我的数字是小数,在C#中,真的有一个专门的类型:decimal,它的位数是128位,范围为1.0 * 10^-28到7.9 * 10^28。我在使用的时候应该是这样:

   Console.WriteLine(10.0M);

   M表示是decimal类型,否则,就会默认转化为double。

   例子虽短,但反映出来的东西却不少,像是:string和String,应该用哪一个?

    我试过,两者都行,C#不是对大小写敏感吗?事实上就是,CLR(学C#的同学一定知道这东西)中是String类型,但在C#中,是string关键字。C#编译器在编译的时候,会进行这样的行为:

    using string = System.String这样的映射操作。

    既然这样,我就用回我以前习惯的String好了,这也是CLR via C#所建议的,但是其他的映射,像是:

    using int = System.Int32;

   using short = System.Int16;

   ...

   为了可读性,我还是使用int,short比较好,就算那样会提高点效率,但可读性也很重要,但如果是调用方法,还是使用Int32比较好说明这是在调用方法。这里倒想要补充一点:System.Single这货一开始让我摸不着头脑,后来才想起来是float!因为float是单精度,所以使用Single表示(对应System.Double的双精度)。稍微吐糟这点,float这个名字让很多人都忘记它是单精度的事实,因为浮点数这样的名称只会认为是小数。

   格式化输出还有一个问题我一直搞不明白:N和F应该用哪一个?

    使用N,会有千分符,像是10000,会变成这样:10,000,但有些结果看上去似乎是一样的,像是10.235,使用N2和F2,是一样的,就连尾数同样是四舍五入。看了资料,说N是数值,F是固定点,还是不明白,望请大神指教。

posted @ 2013-03-11 00:33  文酱  阅读(18826)  评论(10编辑  收藏  举报