如何使用NumberFormatInfo

问题描述 投票:0回答:1

我希望能够根据需要格式化任何十进制数。 具体来说,我希望能够控制:

  1. 小数位数
  2. 小数点分隔符
  3. 千分离

我已经尝试这样做了

var nfi = new NumberFormatInfo();
nfi.NumberDecimalDigits= 4;       <----- for point 1
nfi.NumberDecimalSeparator = "@"; <----- for point 2
nfi.NumberGroupSeparator = "^";   <----- for point 3? or
nfi.PerMilleSymbol= "#";          <----- for point 3?

然后我应用了它:

但由于某些原因我无法得到我所期望的。

如果我看here,它似乎适用于整数?

而且这个答案没有帮助

谢谢

帕特里克

c# formatting double
1个回答
1
投票

格式化属性

NumberDecimalDigits
NumberDecimalSeparator
NumberGroupSeparator
PerMilleSymbol
不适用于所有格式字符串。要确定它们的适用性,您需要检查文档:

  • NumberDecimalDigits
    NumberDecimalDigits 属性与“F”和“N”标准格式字符串一起使用,在数字格式化操作中不带精度说明符。
  • NumberDecimalSeparator
    NumberDecimalSeparator 属性与“E”、“F”、“G”、“N”和“R”标准格式字符串一起使用来定义分隔整数和小数数字的符号。
  • NumberGroupSeparator
    NumberGroupSeparator 属性与“N”标准格式字符串一起使用来定义分隔整数数字组的符号。
  • PerMilleSymbol
    当使用包含“‰”的格式字符串对数值进行格式化时,分配给 PerMilleSymbol 属性的字符串将包含在结果字符串中。

因为,正如 ToString(IFormatProvider)

doc 注释中所述:

ToString(IFormatProvider) 方法以指定区域性的默认(“G”或通用)格式格式化 Double 值。

NumberDecimalSeparator
适用于此格式。您需要传递其他选项所实现的格式才能看到它们的效果。例如:

double aaa = -123456.789;
foreach (var formatString in new [] { "G", "N", "F", "P", "#0.## " + '\u2030'})
{
    string str = aaa.ToString(formatString, nfi);
    Console.WriteLine("aaa.ToString(\"{0}\", nfi) = {1}", formatString, str);
}

结果:

aaa.ToString("G", nfi) = -123456@789
aaa.ToString("N", nfi) = -123^456@7890
aaa.ToString("F", nfi) = -123456@7890
aaa.ToString("P", nfi) = -12,345,678.90 %
aaa.ToString("#0.## ‰", nfi) = -123456789 #

此处演示小提琴:https://dotnetfiddle.net/81HXz9

© www.soinside.com 2019 - 2024. All rights reserved.