自学内容网 自学内容网

C# 自定义数字格式字符串

总目录


前言

当前文章为 C# 中的格式设置(格式化字符串) 大全 中的一个小章节。


一、概述

1. 基本信息

  • 自定义数字格式字符串由一个或多个自定义数字说明符组成,用于定义设置数值数据格式的方式。
  • 自定义数字格式字符串 顾名思义就是自定义的数字格式字符串,相较于标准数字格式字符串字符串 自由度更高。
        static void Main(string[] args)
        {
            double value = 1234.56000;
            
            Console.WriteLine(value.ToString("人名币:#.# 元")); // 输出:人名币:1234.6 元
            Console.WriteLine(value.ToString("C1"));            // 输出:¥1,234.6
        }

如上面的案例中:

  • value.ToString("人名币:#.# 元") 是 自定义数字格式字符串,# 是 自定义数字格式说明符
  • value.ToString("C1") 是 标准数字格式字符串,C 是 标准格式说明符

2. 自定义数字格式说明符 图例

下表描述自定义数字格式说明符并显示由每个格式说明符产生的示例输出。

格式说明符格式类型说明示例
“0”零占位符用对应的数字(如果存在)替换零;
否则,将在结果字符串中显示零
1234.5678 (“00000”) -> 01235
0.45678 (“0.00”, en-US) -> 0.46
0.45678 (“0.00”, fr-FR) -> 0,46
“#”数字占位符用对应的数字(如果存在)替换“#”符号;
否则,不会在结果字符串中显示任何数字。

请注意,如果输入字符串中的相应数字是
无意义的 0,则在结果字符串中不会出现
任何数字。 例如,0003 (“####”) -> 3。
1234.5678 (“#####”) -> 1235
0.45678 (“#.##”, en-US) -> .46
0.45678 (“#.##”, fr-FR) -> ,46
“.”小数点确定小数点分隔符在结果字符串中的位置。0.45678 (“0.00”, en-US) -> 0.46
0.45678 (“0.00”, fr-FR) -> 0,46
“,”组分隔符和数字比例换算用作组分隔符和数字比例换算说明符。
作为组分隔符时,
它在各个组之间插入本地化的组分隔符字符。

作为数字比例换算说明符,
对于每个指定的逗号,它将数字除以 1000。
组分隔符说明符:
2147483647 (“##,#”, en-US) -> 2,147,483,647
2147483647 (“##,#”, es-ES) -> 2.147.483.647
比例换算说明符:
2147483647 (“#,#,”, en-US) -> 2,147
2147483647 (“#,#,”, es-ES) -> 2.147
“%”百分比占位符将数字乘以 100,
并在结果字符串中插入本地化的百分比符号。
0.3697 (“%#0.00”, en-US) -> %36.97
0.3697 (“%#0.00”, el-GR) -> %36,97
0.3697 (“##.0 %”, en-US) -> 37.0 %
0.3697 (“##.0 %”, el-GR) -> 37,0 %
“‰”千分比占位符将数字乘以 1000,
并在结果字符串中插入本地化的千分比符号。
0.03697 (“#0.00‰”, en-US) -> 36.97‰
0.03697 (“#0.00‰”, ru-RU) -> 36,97‰
“E0”
“E+0”
“E-0”
指数表示法如果后跟至少一个 0(零),
则使用指数表示法设置结果格式。
“E”或“e”指示指数符号在结果字符串中是大写还是小写。
跟在“E”或“e”字符后面的零的数目确定指数中的最小位数。
加号 (+) 指示符号字符总是置于指数前面。
减号 (-) 指示符号字符仅置于负指数前面。
987654 (“#0.0e0”) -> 98.8e4
1503.92311 (“0.0##e+00”) -> 1.504e+03
1.8901385E-16 (“0.0e+00”) -> 1.9e-16
\转义符使下一个字符被解释为文本而不是自定义格式说明符。987654 (“\###00\#”) -> #987654#
string’ “string文本字符串分隔符指示应复制到未更改的结果字符串的封闭字符。68 (“# ‘degrees’”) -> 68 degrees
68 (“#’ degrees’”) -> 68 degrees
;部分分隔符通过分隔格式字符串定义正数、负数和零各部分。12.345 ("#0.0#;(#0.0#);-\0-") -> 12.35
0 ("#0.0#;(#0.0#);-\0-") -> -0-
12.345 ("#0.0#;(#0.0#)") -> 12.35
0 ("#0.0#;(#0.0#)") -> 0.0
-12.345 ("#0.0#;(#0.0#)") -> (12.35)
其他所有其他字符字符将复制到未更改的结果字符串。68 (“# °”) -> 68 °

3. 支持自定义数字格式字符串的功能

也可理解为 可使用 自定义数字格式字符串 的地方

  • 所有数字类型的 ToString 方法的某些重载支持自定义数字格式字符串。 例如,可将数字格式字符串提供给 ToString(String) 类型的 ToString(String, IFormatProvider) 方法和 Int32 方法。
  • .NET 复合格式功能也支持自定义数字格式字符串,以供 Console 和 StreamWriter 类的一些 Write 和 WriteLine 方法、String.Format 方法以及 StringBuilder.AppendFormat 方法使用。
  • 字符串内插功能还支持自定义数字格式字符串。

二、自定义数字格式说明符详解

1. “0”自定义说明符

  • “0”自定义格式说明符用作零占位符符号。
        static void Main(string[] args)
        {
            double value = 1234.56489;
            Console.WriteLine(value.ToString("0000000"));           // 输出: 0001235
            Console.WriteLine(value.ToString("000000"));            // 输出: 001235
            Console.WriteLine(value.ToString("00000"));             // 输出: 01235
            Console.WriteLine(value.ToString("00"));                // 输出: 1235
            Console.WriteLine(value.ToString("0"));                 // 输出: 1235
            Console.WriteLine(value.ToString("0.00"));              // 输出: 1234.56
            Console.WriteLine(value.ToString("0.000"));             // 输出: 1234.565
            Console.WriteLine(value.ToString("0.0000"));            // 输出: 1234.5649
            Console.WriteLine(value.ToString("0.00000"));           // 输出: 1234.56489
            Console.WriteLine(value.ToString("0.000000"));          // 输出: 1234.564890

            double value1 = 1234.56400;
            Console.WriteLine(value1.ToString("000000.000000"));    // 输出: 001234.564000
            Console.WriteLine(value1.ToString("0.000000"));         // 输出: 1234.564000
        }
  • 如果要设置格式的值在格式字符串中出现零的位置有一个数字,则将此数字复制到结果字符串中;否则,在结果字符串中显示零。
    • 1234.56489(000000) ->001235 ,格式字符串为000000,1234的位置是数字则复制, 前面的2个位置没有数字,显示0
  • “0”说明符 会进行 四舍五入 运算
    • 1234.56489(0) ->1235
 value = 1234567890;
 Console.WriteLine(value.ToString("0,0", CultureInfo.InvariantCulture));
 Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
                                 "{0:0,0}", value));
 // Displays 1,234,567,890

 CultureInfo elGR = CultureInfo.CreateSpecificCulture("el-GR");
 Console.WriteLine(value.ToString("0,0", elGR));
Console.WriteLine(String.Format(elGR, "{0:0,0}", value));
 // Displays 1.234.567.890

 value = 1234567890.123456;
 Console.WriteLine(value.ToString("0,0.0", CultureInfo.InvariantCulture));
 Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
                                 "{0:0,0.0}", value));
 // Displays 1,234,567,890.1

 value = 1234.567890;
 Console.WriteLine(value.ToString("0,0.00", CultureInfo.InvariantCulture));
 Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
                                 "{0:0,0.00}", value));
 // Displays 1,234.57

2. “#”自定义说明符

  • “#”自定义格式说明符用作数字占位符符号。
        static void Main(string[] args)
        {
            double value = 1234.567;
            Console.WriteLine(value.ToString("#####"));     // 输出: 1235
            Console.WriteLine(value.ToString("#"));         // 输出: 1235
            Console.WriteLine(value.ToString("#.##"));      // 输出: 1234.57
            Console.WriteLine(value.ToString("#.###"));     // 输出: 1234.567
            Console.WriteLine(value.ToString("#.####"));    // 输出: 1234.567
            Console.WriteLine(value.ToString("#.#####"));   // 输出: 1234.567
            Console.WriteLine(value.ToString("#.######"));  // 输出: 1234.567

            value = 1234.50;
            Console.WriteLine(value.ToString("#"));         // 输出: 1235
            Console.WriteLine(value.ToString("#.#"));       // 输出: 1234.5
            Console.WriteLine(value.ToString("#.##"));      // 输出: 1234.5
            Console.WriteLine(value.ToString("#.###"));     // 输出: 1234.5

            Console.WriteLine(value.ToString("[##-##.#]"));         // 输出: [12-34.5]
            Console.WriteLine(value.ToString("[##-##-##.#]"));      // 输出: [-12-34.5]

            value = 123456;
            Console.WriteLine(value.ToString("[##-##-##]"));        // 输出: [12-34-56]

            value = 1234567890;
            Console.WriteLine(value.ToString("(###) ###-####"));    // 输出: (123) 456-7890
            Console.WriteLine(value.ToString("[##-##-##]"));        // 输出: [123456-78-90]
        }
  • #”说明符 会进行 四舍五入 运算
    • 1234.567(#) ->1235
  • 如果设置了格式的值在格式字符串中显示"#"符号的位置有一个数字,则此数字被复制到结果字符串中。 否则,结果字符串中的此位置不存储任何值。
    • 1234.567(#####) ->12351234.567(#.#####) ->1234.567
  • 请注意,如果零不是有效数字,此说明符永不显示零,即使零是字符串中的唯一数字也是如此。 仅当零是所显示的数字中的有效数字时,才会显示零。
    • 1234.50(#.##) ->1234.51234.50(#.###) ->1234.5

3. # 和 0 的 异同点

  • 相同点:
    • 使用 #0 都可以实现对数值的占位
    • 格式化的时候都会四舍五入
  • 不同点:
    • 使用 0 更侧重于 占位
    • 使用 # 更侧重于 有效的数字占位
        static void Main(string[] args)
        {
            double value = 12.340;
            Console.WriteLine(value.ToString("0.000"));             // 输出: 12.340
            Console.WriteLine(value.ToString("#.###"));             // 输出: 12.34
            
            Console.WriteLine(value.ToString("000.000"));           // 输出: 012.340
            Console.WriteLine(value.ToString("###.###"));           // 输出: 12.34
        }
  • #0 混合使用:
    • #0.## 表示小数点前面,没有数字的时候,至少有个0 补位;后面保留2位有效数字
        static void Main(string[] args)
        {
            double value = .086;
            Console.WriteLine(value.ToString("#.##"));      // .09
            Console.WriteLine(value.ToString("#0.##"));     // 0.09
            value = 12.345;
            Console.WriteLine(value.ToString("#0.##"));     // 12.35
            value = 123.4567;
            Console.WriteLine(value.ToString("#0.##"));     // 123.46
        }

4. “.”自定义说明符

  • "."自定义格式说明符在结果字符串中插入本地化的小数分隔符。
  • 格式字符串中的第一个小数点确定设置了格式的值中的小数分隔符的位置;任何其他小数点会被忽略
  • 如果格式说明符以“.”结尾,则仅会将有效数字格式化为结果字符串。
        static void Main(string[] args)
        {
            double value = .086;
            Console.WriteLine(value.ToString("#0."));    // 0
            Console.WriteLine(value.ToString("0."));     // 0
            value = 12.345;
            Console.WriteLine(value.ToString("0."));     // 12
            Console.WriteLine(value.ToString("#."));     // 12
            value = 123.4567;
            Console.WriteLine(value.ToString("."));      // 123
        }
        static void Main(string[] args)
        {
            double value = 1234.567;
            Console.WriteLine(value.ToString(".##"));      // 输出: 1234.57
            value = 1234.56489;
            Console.WriteLine(value.ToString(".0000"));    // 输出: 1234.5649
        }
  • 在结果字符串中用作小数分隔符的字符并非总是小数点;它由控制格式设置的 NumberDecimalSeparator 对象的 NumberFormatInfo 属性确定。

  • "."自定义格式说明符 基本都是配合 #0 或其他说明符一起使用

5. “,”自定义说明符

  • ,”字符用作组分隔符和数字比例换算说明符。
    • 组分隔符:如果在两个设置数字的整数位格式的数字占位符(0 或 #)之间指定一个或多个逗号,则在输出的整数部分中的每个数字组之间插入一个组分隔符字符。例如,如果使用字符串“#,#”和固定区域性对数字 1000 进行格式化,则输出为“1,000”。
    • 数字比例换算符:如果在紧邻显式或隐式小数点的左侧指定一个或多个逗号,则对于每个逗号,将要设置格式的数字除以 1000。 例如,如果使用字符串“0,”对数字 100000000 进行格式化,则输出为“100”。
  • 可以在同一格式字符串中使用组分隔符和数字比例换算说明符。 例如,如果使用字符串“#,0,”和固定区域性对数字 1000000000 进行格式化,则输出为“1,000”。
        static void Main(string[] args)
        {
            double value = 1234567890;
            //单用 , 无法完成格式化
            Console.WriteLine(value.ToString(",", CultureInfo.InvariantCulture));       //
            Console.WriteLine(value.ToString(",,", CultureInfo.InvariantCulture));      //

            //, 用作 数字比例换算符,逗号需要用到自定义格式说明符(0或#)之后
            Console.WriteLine(value.ToString("#", CultureInfo.InvariantCulture));       //  1234567890
            Console.WriteLine(value.ToString("#,", CultureInfo.InvariantCulture));      //  1234568
            Console.WriteLine(value.ToString("#,,", CultureInfo.InvariantCulture));     //  1235
            Console.WriteLine(value.ToString("#,,,", CultureInfo.InvariantCulture));    //  1
            Console.WriteLine(value.ToString("#,,,", CultureInfo.InvariantCulture));    //  1

            // 这种使用方式,等效于 # 
            Console.WriteLine(value.ToString(",#", CultureInfo.InvariantCulture));      //  1234567890
            Console.WriteLine(value.ToString(",,,#", CultureInfo.InvariantCulture));    //  1234567890

            //, 用作 组分隔符,逗号需要用到自定义格式说明符(0或#)之间
            Console.WriteLine(value.ToString("#,#", CultureInfo.InvariantCulture));     //  1,234,567,890
            Console.WriteLine(value.ToString("#,,,,,#", CultureInfo.InvariantCulture)); //  1,234,567,890

            // 混合使用
            Console.WriteLine(value.ToString("#,,#,", CultureInfo.InvariantCulture));   //  1,234,568
            Console.WriteLine(value.ToString("#,#,,", CultureInfo.InvariantCulture));   //  1,235
        }

6. “%”自定义说明符

  • 格式字符串中的百分号 (%) 将使数字在设置格式之前乘以 100。
        static void Main(string[] args)
        {
            double value = 0.12345;
            Console.WriteLine(value.ToString("#"));       // 输出: 
            Console.WriteLine(value.ToString("#%"));         // 输出: 12 %
            Console.WriteLine(value.ToString("#.##%"));      // 输出: 12.35 %
            Console.WriteLine(value.ToString("#.###%"));     // 输出: 12.345 %
            Console.WriteLine(value.ToString("#.####%"));    // 输出: 12.345 %
            Console.WriteLine(value.ToString("#.#####%"));   // 输出: 12.345 %
            Console.WriteLine(value.ToString("#.######%"));  // 输出: 12.345 %
        }
  • 使用#% 将数字格式化成为百分比数值
  • 格式化的时候会进行四舍五入
  • 0.12345 使用 # 格式化的时候,由于无法格式化成为整数,因此返回null
double value = .086;
Console.WriteLine(value.ToString("#0.##%", CultureInfo.InvariantCulture));
  • 使用0符号进行格式化的时候,可以配合其他的字符(如 $ )完成对数据的格式化显示
        static void Main(string[] args)
        {
            double value = 0.12345;
            Console.WriteLine(value.ToString("0"));       // 输出: 0
            Console.WriteLine(value.ToString("0%"));         // 输出: 12%
            Console.WriteLine(value.ToString("0.00%"));      // 输出: 12.35%
            Console.WriteLine(value.ToString("0.000%"));     // 输出: 12.345%
            Console.WriteLine(value.ToString("0.0000%"));    // 输出: 12.3450%
            Console.WriteLine(value.ToString("0.00000%"));   // 输出: 12.34500%
            Console.WriteLine(value.ToString("0.000000%"));  // 输出: 12.345000%
        }
  • 使用0% 将数字格式化成为百分比数值
  • 格式化的时候会进行四舍五入,并且还会进行占位

7. “‰”自定义说明符

  • 格式字符串中的千分比字符(‰ 或 \u2030)将使数字在设置格式之前乘以 1000。 在返回的字符串中,相应的千分比符号插在格式字符串中出现 ‰ 符号的位置。
        static void Main(string[] args)
        {
            double value = 0.00354;
            Console.WriteLine(value.ToString("0‰"));                   // 输出: 4‰
            Console.WriteLine(value.ToString("0.00‰"));                // 输出: 3.54‰

            Console.WriteLine(value.ToString("0" + '\u2030'));          // 输出: 4‰
            Console.WriteLine(value.ToString("0.00" + '\u2030'));       // 输出: 3.54‰

            Console.WriteLine(value.ToString("#0.## " + '\u2030'));     // 输出: 3.54 ‰
        }
  • \u2030 都表示千分比符号

8. “E”和“e”自定义说明符

在这里插入图片描述

9. \ 转义字符

格式字符串中的“#”、“0”、“.”、“,”、“%”和“‰”符号被解释为格式说明符而不是文本字符。 大写和小写“E”以及 + 和 - 符号也可能被解释为格式说明符,具体取决于它们在自定义格式字符串中的位置。

若要防止某个字符被解释为格式说明符,你可以在该字符前面加上反斜杠(即转义字符)。 转义字符表示以下字符为应包含在未更改的结果字符串中的字符文本。

若在要结果字符串中包括反斜杠,必须使用另一个反斜杠 (\) 对其转义。

int value = 123;
Console.WriteLine(value.ToString("\\#\\#\\# ##0 dollars and \\0\\0 cents \\#\\#\\#"));
Console.WriteLine(String.Format("{0:\\#\\#\\# ##0 dollars and \\0\\0 cents \\#\\#\\#}",
                                value));
// Displays ### 123 dollars and 00 cents ###

Console.WriteLine(value.ToString(@"\#\#\# ##0 dollars and \0\0 cents \#\#\#"));
Console.WriteLine(String.Format(@"{0:\#\#\# ##0 dollars and \0\0 cents \#\#\#}",
                                value));
// Displays ### 123 dollars and 00 cents ###

Console.WriteLine(value.ToString("\\\\\\\\\\\\ ##0 dollars and \\0\\0 cents \\\\\\\\\\\\"));
Console.WriteLine(String.Format("{0:\\\\\\\\\\\\ ##0 dollars and \\0\\0 cents \\\\\\\\\\\\}",
                                value));
// Displays \\\ 123 dollars and 00 cents \\\

Console.WriteLine(value.ToString(@"\\\\\\ ##0 dollars and \0\0 cents \\\\\\"));
Console.WriteLine(String.Format(@"{0:\\\\\\ ##0 dollars and \0\0 cents \\\\\\}",
                                value));
// Displays \\\ 123 dollars and 00 cents \\\

10. “;”部分分隔符

分号 (;) 是条件格式说明符,它可以对数字应用不同的格式设置,具体取决于值为正、为负还是为零。 为产生这种行为,自定义格式字符串可以包含最多三个用分号分隔的部分。 下表描述了这些部分。
在这里插入图片描述
格式化最终值时,部分分隔符忽略所有先前存在的与数字关联的格式设置。 例如,使用部分分隔符时,显示的负值永远不带负号。 如果你希望格式化后的最终值带有负号,则应明确包含负号,让它作为自定义格式说明符的组成部分。

下面的示例使用“;”格式说明符来分别设置正数、负数和零的格式。

        static void Main(string[] args)
        {
            double posValue = 1234;
            double negValue = -1234;
            double zeroValue = 0;

            //分隔为一个部分时 ,应用于所有值(正值,负值,零)
            Console.WriteLine(posValue.ToString("##;"));    // 输出:1234
            Console.WriteLine(negValue.ToString("##;"));    // 输出:-1234
            Console.WriteLine(zeroValue.ToString("#0;"));   // 输出:0     

            //分隔为两个部分时,第一部分为正值和零,第二部分应用于负值
            string fmt2 = "#0;(-#0)";
            Console.WriteLine(posValue.ToString(fmt2));     // 输出:1234
            Console.WriteLine(negValue.ToString(fmt2));     // 输出:(-1234)
            Console.WriteLine(zeroValue.ToString(fmt2));    // 输出:0     

            //分隔为三个部分时,第一部分为正值,第二部分为负值,第三部分为零
            string fmt3 = "#0;(-#0);**Zero**";
            Console.WriteLine(zeroValue.ToString(fmt3));    // 输出:**Zero** 

        }

11. 字符文本

  • 出现在自定义数值格式字符串中的格式说明符始终解释为格式字符而不是文本字符。 这包括以下字符:0#%\.E 或 e,取决于它在格式字符串中的位置。
  • 所有其他字符始终解释为字符文本,在格式设置操作中,将按原样包含在结果字符串中。
        static void Main(string[] args)
        {
            double value = 1234.56000;
            Console.WriteLine(value.ToString("人名币:#.# 元")); // 输出:人名币:1234.6 元
            Console.WriteLine(value.ToString("人名币:#.#"));    // 输出: 人名币:1234.6
            
            Console.WriteLine(value.ToString("$#.#"));           // 输出: $1234.6
            Console.WriteLine(value.ToString("#.#元"));          // 输出: 1234.6元
            Console.WriteLine(value.ToString("#.##元"));         // 输出: 1234.56元
            
            Console.WriteLine(value.ToString("#.### 美元"));     // 输出: 1234.56 美元
            Console.WriteLine(value.ToString("#.#### $"));       // 输出: 1234.56 $
        }
        static void Main(string[] args)
        {
            double value = 1234.56489;

            Console.WriteLine(value.ToString("数值:0000000"));             // 输出: 数值:0001235
            Console.WriteLine(value.ToString("00|0000"));                   // 输出: 00|1235
            Console.WriteLine(value.ToString("0000"));                      // 输出: 1235
            Console.WriteLine(value.ToString("$ 0.00"));                    // 输出: $ 1234.56

            Console.WriteLine(value.ToString("人名币:0.000 ¥"));          // 输出: 人名币:1234.565 ¥
            Console.WriteLine(value.ToString(".0000"));                     // 输出: 1234.5649
            Console.WriteLine(value.ToString("人名币:0.0000"));            // 输出: 人名币:1234.5649
            Console.WriteLine(value.ToString("人名币:.00000"));            // 输出: 人名币:1234.56489
        }

12. 四舍五入说明

        static void Main(string[] args)
        {
            double value = 123.45;
            Console.WriteLine(value.ToString("0"));      // 123

            value = 234.56;
            Console.WriteLine(value.ToString("0"));      // 235

            value = 123.445;
            Console.WriteLine(value.ToString("0.0"));    // 123.4

            value = 123.455;
            Console.WriteLine(value.ToString("0.0"));    // 123.5
        }
  • 四舍五入运算说明
    • 123.45(0)-> 123 ,123.45 不保留小数位,小数点后面是4 四舍
    • 234.56(0)-> 235 ,234.56 不保留小数位,小数点后面是5 五入
    • 123.445(0)-> 123.4,123.445 保留1位小数位,123.445 中 123.4后面是4 四舍
    • 123.455(0)-> 123.5 ,123.455 保留1位小数位,123.455 中 123.4后面是5 五入

结语

回到目录页:C# 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。


参考资料
自定义数字格式字符串
概述:如何在 .NET 中设置数字、日期、枚举和其他类型的格式


原文地址:https://blog.csdn.net/qq_39847278/article/details/144818755

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!