格式字符串中的多个前导“#”符号有啥作用吗?
Posted
技术标签:
【中文标题】格式字符串中的多个前导“#”符号有啥作用吗?【英文标题】:Do multiple leading '#' signs in format strings do anything?格式字符串中的多个前导“#”符号有什么作用吗? 【发布时间】:2016-10-03 21:51:08 【问题描述】:在一些遗留的 .NET 代码中,我遇到了许多自定义数字格式字符串,如下所示:
###,##0.00
这和有什么区别:
#,#0.00
?
编辑:
以下是我尝试过的一些示例输入,所有这些输入对于两个掩码都产生相同的结果:1000000、1000、100、10、1.456、-30000、0.002。
编辑:
@Sahuagin 建议这些掩码可能是相同的,因为文化如何设置为三位数。但是,即使使用它,我也无法证明有什么不同:
var culture = new CultureInfo("en-US");
culture.NumberFormat.NumberGroupSizes = new[] 1, 2, 3, 4 ;
culture.NumberFormat.NumberGroupSizes.Dump();
1234567890.ToString("#,#0.00", culture).Dump(); // 1234,567,89,0.00
1234567890.ToString("###,#0.00", culture).Dump(); // 1234,567,89,0.00
更一般地说,我知道 # 是一个“可选”数字,不会创建前导零或尾随零。但是,似乎小数点前只有一个 # 就足以获取所有前导数字。 MSDN docs 似乎区分了# 和##,但这种解释对我来说没有多大意义,而且我还没有找到一个可以产生影响的例子。
【问题讨论】:
您在尝试这些样本时看到了什么? @L.B 你到底在说什么样本? 【参考方案1】:#
表示数字将出现的位置,如果数字中存在数字。没有任何此类符号,前导数字会自动出现(尽管您必须至少有一个 #
或一个 0
,否则不会出现数字),但它们仍然可以用作某些格式的占位符,例如电话号码:
var value = 1234567890;
Console.WriteLine("0:###-###-####", value);
// outputs 123-456-7890
在您的#,#0.00
示例中,我认为只能正确格式化(三个一组),因为,
是一个特殊的分组符号,并且文化信息设置为三个一组的数字。没有它,你会得到类似123-45.67
的东西,如果你使用-
而不是,
。
这里是来自MSDN 的关于,
的更多具体信息:
“,”字符既用作组分隔符,又用作数字缩放说明符。
组分隔符:如果在格式化数字的整数位的两位占位符(0 或 #)之间指定一个或多个逗号,则在输出的整数部分的每个数字组之间插入一个组分隔符。
当前 NumberFormatInfo 对象的 NumberGroupSeparator 和 NumberGroupSizes 属性确定用作数字组分隔符的字符和每个数字组的大小。例如,如果使用字符串“#,#”和不变区域性来格式化数字 1000,则输出为“1,000”。
数字缩放说明符:如果在显式或隐式小数点左侧立即指定一个或多个逗号,则每个逗号要格式化的数字除以 1000。例如,如果字符串“0,”用于格式化数字一亿,则输出为“100”。
因此,在您的第一个###,##0.00
示例中,如果需要,它可能会简化为#,0.00
,尽管#,##0.00
是我通常使用的,因为它更清晰。
【讨论】:
在您的电话示例中,Console.WriteLine("0:#-###-####", value);
似乎产生了相同的结果(尽管掩码不太明显)。另外,关于你对文化的评论,你能举一个具体的例子,我的问题中的两个面具返回不同的值吗?我试过了,但找不到区别(请参阅我的问题中的编辑)。
@ChaseMedallion 我想我明白你的意思,他们半说##
有一个特殊的含义,与舍入有关,但我没有看到其他任何地方说那,我没有看到任何显示差异的示例,并且在使用它时我找不到差异。答案似乎在于CLI Source,但很难弄清楚。我没有看到任何明显的迹象表明##
具有特殊含义。以上是关于格式字符串中的多个前导“#”符号有啥作用吗?的主要内容,如果未能解决你的问题,请参考以下文章