格式字符串中的多个前导“#”符号有啥作用吗?

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,但很难弄清楚。我没有看到任何明显的迹象表明## 具有特殊含义。

以上是关于格式字符串中的多个前导“#”符号有啥作用吗?的主要内容,如果未能解决你的问题,请参考以下文章

python中为啥用json有啥作用

可执行格式有啥区别?

将整个单词与字符串中的前导或尾随特殊符号(如美元)匹配

初解正则表达式

第九十四章 SQL函数 %MINUS

将带有前导“0x”的十六进制字符串转换为C++中的有符号短字符串?