gpt4 book ai didi

c# - 十进制到带有千位分隔符的字符串?

转载 作者:太空狗 更新时间:2023-10-29 21:02:21 26 4
gpt4 key购买 nike

考虑一个 Decimal 值:

Decimal value = -1234567890.1234789012M;

我想将此 Decimal 值转换为字符串,并包含 “千位分隔符”

Note: i don't want to include thousand's separators, i want to include digit grouping. The difference is important for cultures that don't group numbers into thousands, or don't use commas to separate groups

在我的计算机上,使用我当前的语言环境,使用不同的标准格式字符串输出的一些示例:

value.ToString()        =  -1234567890..1234789012   (Implicit General)
value.ToString("g") = -1234567890..1234789012 (General)
value.ToString("d") = FormatException (Decimal whole number)
value.ToString("e") = -1..234568e++009 (Scientific)
value.ToString("f") = -1234567890..123 (Fixed Point)
value.ToString("n") = -12,,3456,,7890..123 (Number with commas for thousands)
value.ToString("r") = FormatException (Round trippable)
value.ToString("c") = -$$12,,3456,,7890..123 (Currency)
value.ToString("#,0.#") = -12,,3456,,7890..1

想要(取决于文化)是:

en-US      -1,234,567,890.1234789012
ca-ES -1.234.567.890,1234789012
gsw-FR -1 234 567 890,1234789012 (12/1/2012: fixed gws-FR to gsw-FR)
fr-CH -1'234'567'890.1234789012
ar-DZ 1,234,567,890.1234789012-
prs-AF 1.234.567.890,1234789012-
ps-AF 1،234،567،890,1234789012-
as-IN -1,23,45,67,890.1234789012
lo-LA (1234567,890.1234789012) (some debate if numbers should be "1,234,567,890")
qps-PLOC 12,,3456,,7890..1234789012

如何将 Decimal 转换为带数字分组的字符串?


更新:一些更多的所需输出,使用我当前的文化:

-1234567890M             -->   -12,,3456,,7890
-1234567890.1M --> -12,,3456,,7890..1
-1234567890.12M --> -12,,3456,,7890..12
-1234567890.123M --> -12,,3456,,7890..123
-1234567890.1234M --> -12,,3456,,7890..1234
-1234567890.12347M --> -12,,3456,,7890..12347
-1234567890.123478M --> -12,,3456,,7890..123478
-1234567890.1234789M --> -12,,3456,,7890..1234789
-1234567890.12347890M --> -12,,3456,,7890..1234789
-1234567890.123478901M --> -12,,3456,,7890..123478901
-1234567890.1234789012M --> -12,,3456,,7890..1234789012

更新:我尝试查看Decimal.ToString() 如何设法使用General 格式来显示它需要的所有数字显示:

public override string ToString()
{
return Number.FormatDecimal(this, null, NumberFormatInfo.CurrentInfo);
}

除了 Number.FormatDecimal 隐藏在某处:

[MethodImpl(MethodImplOptions.InternalCall)]
public static extern string FormatDecimal(decimal value, string format, NumberFormatInfo info);

所以这是一个死胡同。

最佳答案

默认情况下,小数上的 ToString 方法使用用户 session 的 CultureInfo.CurrentCulture,因此根据运行代码的人而有所不同。

ToString 方法还接受各种重载中的 IFormatProvider。这是您需要提供特定于文化的格式化程序的地方。

例如,如果您为 fr-CH 传递 NumberFormat,您可以按照该文化期望的方式格式化内容:

var culture = CultureInfo.CreateSpecificCulture("fr-CH");
Decimal value = -1234567890.1234789012M;

Console.WriteLine(value.ToString("##,#.###############", culture.NumberFormat));

会输出

 -1'234'567'890.1234789012

编辑 #3 - 使用自定义格式化程序重写。这应该根据新更新的问题做你想做的。

编辑 #4 - 获取所有输入,然后运行:

public void TestOutput()
{
PrintValue(-1234567890M);
PrintValue(-1234567890.1M);
PrintValue(-1234567890.12M);
PrintValue(-1234567890.123M);
PrintValue(-1234567890.1234M);
PrintValue(-1234567890.12347M);
PrintValue(-1234567890.123478M);
PrintValue(-1234567890.1234789M);
PrintValue(-1234567890.12347890M);
PrintValue(-1234567890.123478901M);
PrintValue(-1234567890.1234789012M);
}

private static void PrintValue(decimal value)
{
var culture = CultureInfo.CreateSpecificCulture("qps-PLOC");
Console.WriteLine(value.ToString("##,#.###############", culture.NumberFormat));
}

给出与您提供的匹配的输出:

--12,,3456,,7890
--12,,3456,,7890..1
--12,,3456,,7890..12
--12,,3456,,7890..123
--12,,3456,,7890..1234
--12,,3456,,7890..12347
--12,,3456,,7890..123478
--12,,3456,,7890..1234789
--12,,3456,,7890..1234789
--12,,3456,,7890..123478901
--12,,3456,,7890..1234789012

正如 Joshua 所指出的,这仅适用于某些语言环境。

从表面上看,您需要在两害相权取其轻:了解数字的精度,或为每种文化指定格式。我敢打赌,知道您的数字的准确性可能会更容易。在这种情况下,我的答案的先前版本可能会有用:

要显式控制要输出的小数位数,您可以克隆区域性提供的数字格式并修改 NumberDecimalDigits 属性。

var culture = CultureInfo.CreateSpecificCulture("fr-CH");
Decimal value = -1234567890.1234789012M;
NumberFormatInfo format = (NumberFormatInfo)culture.NumberFormat.Clone();
format.NumberDecimalDigits = 30;

Console.WriteLine(value.ToString("n", format));

这个输出:

-1'234'567'890.123478901200000000000000000000

关于c# - 十进制到带有千位分隔符的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11415405/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com