2016-01-22 268 views
3

好这里的代码示例:什么是字符串格式C#{0,12:N0}(冒号和引号)

string header = String.Format("{0,-12}{1,8}{2,12}{1,8}{2,12}{3,14}\n", 
           "City", "Year", "Population", "Change (%)"); 
    Console.WriteLine(header); 
    string output;  
    foreach (var city in cities) { 
    output = String.Format("{0,-12}{1,8:yyyy}{2,12:N0}{3,8:yyyy}{4,12:N0}{5,14:P1}", 
          city.Item1, city.Item2, city.Item3, city.Item4, city.Item5, 
          (city.Item5 - city.Item3)/ (double)city.Item3); 
    Console.WriteLine(output); 
    } 
} 
} 
// The example displays the following output: 
// City   Year Population Year Population Change (%) 
//  
// Los Angeles  1940 1,504,277 1950 1,970,358  31.0 % 
// New York  1940 7,454,995 1950 7,891,957   5.9 % 
// Chicago   1940 3,396,808 1950 3,620,962   6.6 % 
// Detroit   1940 1,623,452 1950 1,849,568  13.9 % 

我了解的ARGS冒号后{0:N0}表示没有小数点,但昏迷呢?如{0,-12}和{1,12}逗号在字符串格式的参数后的含义是什么?

+5

如果只有有[某种文件(https://msdn.microsoft.com/en-us/library/0c899ak8(V = vs.110)。 aspx) – Ian

+0

@Ian:哦,谢谢!我只发现[这](https://msdn.microsoft.com/en-us/library/system.string.format%28v=vs.110%29.aspx)大声笑。谢谢,当我阅读msdn本身时,我并没有真正了解它,因为这个例子并不多。 –

+1

花时间学习如何浏览MSDN页面。我个人发现,他们习惯了将他们与各种成员/方法区分开来,但一旦你习惯了他们,他们就非常棒。 – Ian

回答

6

MSDN文档是你的朋友(我的意见给了上面的链接是不是最好的):
Composite Formatting

每个格式项都采用以下形式,它由以下几部分组成: {索引[,对准] [:formatString的]}

所以index是明显的提供参数的索引:

String.Format("Second argument = {1}, first argument = {0}", arg1, arg2); 

Alignment指定字段和水平取向的所需宽度:

该字段中的格式化的数据是右对齐如果对准为正和左对齐如果对准是负的。

String.Format("{0,-12}" + // first argument, left align, 12 character wide column 
       "{1,8:yyyy}" + // second argument, right align, 8 character wide column, 
          // formatted as a year 
       "{2,12:N0}" + // third argument, right align, 12 character wide column, 
          // formatted as a number, 0 decimal places 

而且formatString你已经知道(例如The Numeric ("N") Format Specifier)。

1

The Numeric ("N") Format Specifier

的数字( “N”)格式说明一个数字转换为的 形式 “-d,DDD,ddd.ddd ...”,其中的字符串 “ - ” 表示负的数如果需要的话 符号,“d”表示一个数字(0-9),“”表示的基团 分离器,和“”表示小数点符号。精度 说明符指示的数字的小数 点之后的期望数量。如果省略精度说明符,小数 名额由目前的NumberFormatInfo.NumberDecimalDigits 属性定义的。

结果字符串由当前NumberFormatInfo对象的格式化信息 影响。下表列出了控制结果 字符串格式化 的NumberFormatInfo属性。

对于N0,实际输出将不包含小数点后的数字(如整数值)。

Align numbers with spaces

要对齐浮点数向右使用逗号 冒号前“”选项。键入逗号后跟一些空格,例如“0,10:0.0” (这可以用于仅在的String.Format方法,而不是在double.ToString 方法)。要将数字与左侧对齐,请使用负数的空格。

+0

那么为什么{0,-12}和{2,12}在他们的上诉中没有任何区别? –

2

它们索引组件对准组分,它是的Composite Formatting一部分。这里是复合格式化语法;

{index[,alignment][:formatString]} 

在你的情况下,{0,-12}{1,12}01是其指向要格式化你的第2种元素的指数成份股。并且-1212是对齐组件。它们可以是负值或正值。

正值表示右对齐,负值表示对齐左边。

如果你想利用对准部件,你必须其从指数成分用逗号分隔。如您在语法上看到的,冒号(:)将对齐组件与formatString分开。

由于您使用{0,-12}"Los Angeles"(这是11字符),它会与一个(12 - 11)空白字符向左对齐。

Console.WriteLine("{0, -12}{1}", "Los Angeles", "1940"); // prints "Los Angeles 1940" 

Chicago(这是7字符),它会被对准五(12 - 7)空白字符向左作为;

Console.WriteLine("{0, -12}{1}", "Chicago", "1940"); // prints "Chicago  1940" 

对于正值;

Console.WriteLine("{0, 12}{1}", "Los Angeles", "1940"); // prints " Los Angeles1940" 

Console.WriteLine("{0, 12}{1}", "Chicago", "1940"); // prints "  Chicago1940"