【问题标题】:Special decimal formatting特殊的十进制格式
【发布时间】:2010-12-02 14:36:32
【问题描述】:

有没有可以在小数上使用的字符串格式,从而得到如下结果?

123 => "123"
123.4 => "123.40"
123.45 => "123.45"
123.456 => "123.46"

在英语中,数字应始终显示为正好两位小数,除非它包含整数值,此时不应有小数(因此不允许显示“123.00”)。

【问题讨论】:

  • “整数值”是什么意思?例如。你认为 123.001 是一个整数(显示为“123”)还是不是(显示为“123.00”)?
  • 我指的是数学意义上的整数,与任何实际数据类型无关。

标签: c# formatting decimal


【解决方案1】:

恐怕我不知道这种格式。您可能需要使用:

string text = (d == (int) d) ? ((int) d).ToString() : d.ToString("N2");

编辑:上面的代码仅在dint.MinValueint.MaxValue 之间的范围内有效。显然你可以比使用long 做得更好,但如果你想覆盖decimal 的全部范围,你需要更强大的东西。

【讨论】:

  • 这不适用于 Int32.MinValue 到 Int32.MaxValue 范围之外的值。当 OP 说“整数值”时,我会假设他的意思是数学意义上的,而不是 Int32 或 Int64 类型。
  • 虽然如此,但我可以看到的明显用途是货币显示。在这种情况下,OP 很可能知道他的值将在范围内。
  • 添加了乔恩答案的派生词。
【解决方案2】:

也许并不理想,但只是一个起点。只需格式化为 2 位小数,并将任何 .00 替换为空字符串。

decimal a = 123;
decimal b = 123.4M;
decimal c = 123.456M;

Debug.Assert(a.ToString("0.00").Replace(".00", "") == "123");
Debug.Assert(b.ToString("0.00").Replace(".00", "") == "123.40");
Debug.Assert(c.ToString("0.00").Replace(".00", "") == "123.46");

【讨论】:

  • 如果当前区域性不使用句点作为小数点分隔符,则不起作用。
【解决方案3】:

您可以使用“#.##”作为格式字符串。所以:

123.23.ToString("#.##") => 123.23
123.00.ToString("#.##") => 123

需要注意的是:

123.001.ToString("#.##") => 123

但这是否可以接受取决于你。

【讨论】:

  • 我也犯了同样的错误;这与 123.4 的规范不匹配。这是一个很容易犯的错误,因为它是一种奇怪的格式。
  • 确实,我们现在正在使用#.##,但我们注意到值 123.5 实际上应该显示为“123.50”。如果有一种格式可以做到这一点而不是编码所有这些,那就太好了......
【解决方案4】:

这样的?

public static string ToSpecialFormatString(this decimal val)

  if (val == Math.Floor(val))
  {
    return val.ToString("N0");
  }
  return val.ToString("N2");
}

【讨论】:

    【解决方案5】:

    你应该先使用 Math.Round 方法,然后使用 toString() 转换

        //123.456 => "123.46"
        myDecimal = Math.Round(myDecimal, 2);
    

    第二个参数是要四舍五入的小数位数 然后您执行以下操作:

        myDecimal.ToString(); 
    

    实际上不需要 N2,这样您在四舍五入后“按原样”显示数字,即,如果点后没有小数,则显示为 124,或者四舍五入后显示为 123.46 123.456

    【讨论】:

    • 例如,这不适用于 123.4。字符串将是“123.4”,我需要“123.40”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多