gpt4 book ai didi

c# - 这可以单独使用格式化字符串来完成吗?

转载 作者:行者123 更新时间:2023-11-30 16:54:58 27 4
gpt4 key购买 nike

我想我发现了一些无法单独使用格式化字符串来完成的事情:我需要一个字符串,它可以让我格式化一个 double 以不显示小数,这样:

  • 数字以千位分隔
  • 0 表示破折号
  • 负数显示在括号内
  • 0.5四舍五入为1,-0.5四舍五入为-1
  • 0.4999..四舍五入为0,-0.4999...四舍五入为-0(必须显示为“(0)”)

我已经到了。

“{0:#,0;(#,0);-}”

但是,这会将(-0.5 和 0.5)之间的那些数字显示为“-”。如果我将其替换为以下内容。

“{0:#,0.#;(#,0.#);-}”

这“没问题”,除了它会显示带小数点的数字,我需要它们四舍五入。

为了便于说明,我试过:

string format = "#,0;(#,0);-";

Console.WriteLine(1000000.ToString(format));
Console.WriteLine(1000.ToString(format));
Console.WriteLine(100.ToString(format));
Console.WriteLine(10.ToString(format));
Console.WriteLine(1.ToString(format));
Console.WriteLine(0.5.ToString(format));
Console.WriteLine(0.4.ToString(format));
Console.WriteLine(0.ToString(format));
Console.WriteLine((-0.4).ToString(format));
Console.WriteLine((-0.5).ToString(format));
Console.WriteLine((-1).ToString(format));
Console.WriteLine((-1000000).ToString(format));

给出:

1,000,000
1,000
100
10
1
1
-
-
-
(1)
(1)
(1,000,000)

和:

string format = "#,0.#;(#,0.#);-";

Console.WriteLine(1000000.ToString(format));
Console.WriteLine(1000.ToString(format));
Console.WriteLine(100.ToString(format));
Console.WriteLine(10.ToString(format));
Console.WriteLine(1.ToString(format));
Console.WriteLine(0.5.ToString(format));
Console.WriteLine(0.4.ToString(format));
Console.WriteLine(0.ToString(format));
Console.WriteLine((-0.4).ToString(format));
Console.WriteLine((-0.5).ToString(format));
Console.WriteLine((-1).ToString(format));
Console.WriteLine((-1000000).ToString(format));

哪些输出:

1,000,000
1,000
100
10
1
0.5
0.4
-
(0.4)
(0.5)
(1)
(1,000,000)

但这就是我要实现的目标:

1,000,000
1,000
100
10
1
1
0
-
(0)
(1)
(1)
(1,000,000)

所以我决定使用第一个格式字符串,然后重新处理那些以“-”形式出现的值,但我想知道是否有办法单独使用格式字符串来完成此操作。

感谢您的帮助!

最佳答案

这可以单独使用格式化字符串来完成吗?

没有。

https://msdn.microsoft.com/en-us/library/0c899ak8%28v=vs.110%29.aspx#SectionSeparator

三个部分

第一部分适用于正值,第二部分适用于负值,第三部分适用于零

如果要格式化的数字不是零,但根据第一部分或第二部分中的格式舍入后变为零结果零将根据第三部分格式化。

(强调)

正如我读到的那样,使用单一格式字符串似乎不可能在同一组输出中同时“0”和“-”(只有值发生变化)。 “0”将使用您希望为“-”的第三种格式。

除了说“不”——还能做什么?您是否考虑过创建一种方法来以您需要的格式输出?

您可以使用扩展方法来做到这一点:

public static string ToStringZeroDash(this decimal value, string format)
{
return value == 0 ? "-" : value.ToString(format);
}

例子

(0.4).ToStringZeroDash("{0:#,0.#;(#,0.#);0}")

请注意格式的第三部分是 0,但扩展在到达那里之前返回“-”。

编辑:您可能需要 (this double value .. 或任何实际值类型,您可以使用默认格式使格式可选/重载。

编辑:上面的编辑是为了表明我确实阅读了问题...我总是使用 decimal 这样浮点计算就不是问题了,正如 weston 在评论。为了完整起见,这里有一个 double 的版本:

public static string ToStringZeroDash(this double value, string format)
{
const double tolerance = 0.0001;
return Math.Abs(value) < tolerance ? "-" : value.ToString(format);
}

根据需要更改公差(有些人称之为“epsilon”)。

关于c# - 这可以单独使用格式化字符串来完成吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30104760/

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