十进制数格式化为字符串,至少包含1个数字,没有上限。

6

如何在C#中格式化 decimal ,以使小数点后至少有一位数字,但如果指定小数点后多于1位数字,则没有固定的上限:

5 -> "5.0"
5.1 -> "5.1"
5.122 -> "5.122"
10.235544545 -> "10.235544545"
3个回答

13

使用ToString("0.0###########################")

一些注意事项:

  • 里面有27个#,因为decimal结构可以容纳高达28位小数的精度。
  • 0自定义格式说明符将导致始终显示数字,即使值为0。
  • #自定义格式说明符仅在该数字为零且该数字右/左侧(取决于您所处的小数点位置)的所有数字都为零时才显示值。
  • 您需要在小数点右侧的第一个0后插入尽可能多的#以适应您将传递给ToString的所有值的长度,如果您只需要精确到10位小数,则需要九个#(因为您已经处理了右侧的第一位小数点)

有关更多信息,请参阅MSDN标题为“自定义数字格式字符串”的部分


谢谢,但我正在寻找比所有#更清晰的解决方案。 - Stian
@Stian:没有其他格式说明符可以做到你想要的效果,这是无法避免的。如果你不使用足够的“#”,那么结果将会四舍五入。唯一的选择是编写一个扩展方法ToString,它可以实现你想要的功能。然而,你必须传递某种虚拟变量给它,因为扩展方法不会覆盖与其具有相同签名的类型上的方法(或者另外命名)。 - casperOne
@Stian,它并不完全不洁。但如果您愿意,并且为了促进可重用性,您可以将其隐藏在某个静态类中,并将其作为扩展方法,这样您就不必看到它的内部,而只需调用它即可。@casper,不需要虚拟变量,只需不要将其命名为 ToString() - Anthony Pegram
@Stian:更新了所有情况,你需要一个 0 和 27 个 # 来覆盖所有小数。@AnthonyPegram:没错,但我在评论中已经提到了这一点。 - casperOne
1
@Stian:另一个选项是创建一个静态的FormatStrings类,其中包含一个静态或常量的AllDecimalDigits字符串成员,其中包含所需的格式字符串。然后,您只需要执行myDecimal.ToString(FormatStrings.AllDecimalDigits)即可。 - LukeH

2
[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        var a = 5m;
        var b = 5.1m;
        var c = 5.122m;
        var d = 10.235544545m;

        var ar = DecToStr.Work(a);
        var br = DecToStr.Work(b);
        var cr = DecToStr.Work(c);
        var dr = DecToStr.Work(d);

        Assert.AreEqual(ar, "5.0");
        Assert.AreEqual(br, "5.1");
        Assert.AreEqual(cr, "5.122");
        Assert.AreEqual(dr, "10.235544545");
    }
}

public class DecToStr
{
    public static string Work(decimal val)
    {
        if (val * 10 % 10 == 0)
            return val.ToString("0.0");
        else
            return val.ToString();
    }
}

0
Func<decimal, string> FormatDecimal = d => (
    d.ToString().Length <= 3 || 
    !d.ToString().Contains(".")) ? d.ToString("#.0") : d.ToString()
);

那么如果像 d=1000 这样的情况会失败吗?因为它的字符串表示长度会超过 3 个字符。 - Chris
糟糕,修复了那个问题。仍旧只有一行。 - Ta01
我不喜欢这个答案。它并不难以理解。我认为Turowicz的回答使代码的意图更加清晰。 - SolutionYogi
“不易读”这个评价非常主观。你可以自由选择点踩,但是这个函数也通过了所有的单元测试。 - Ta01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接