【问题标题】:C# - String formatting: double fixed widthC# - 字符串格式:双倍固定宽度
【发布时间】:2012-09-28 15:09:00
【问题描述】:

如何在 C# 中使用String.Format,这样双打显示如下:

价值观:

-1.0
1.011
100.155
1000.25
11000.52221

显示的字符串:

-1.00
1.011
100.2
 1000
11001

重点是我的宽度无论如何都固定为 5 个字符。我真的不在乎右边显示了多少小数位。如果小数点左侧有 4 个或更多数字,我希望删除小数点右侧的所有内容(包括小数点本身)。

这似乎应该是一种非常标准的做法。但我没有找到有效的答案。

对上面的显示字符串进行了一些更正,我确实想要四舍五入。

谢谢!

【问题讨论】:

  • -11111 怎么样?应该是11111.
  • “这似乎应该是一个非常标准的做法” - 实际上不是。排列小数点是常见的做法...
  • 而 100.1 不应该是 100.2?
  • 如果您的号码超过 5 位怎么办? 123456如何处理?是12345吗?还是只是超出范围?
  • @HaemEternal 听起来 Harpo 只是想去掉数字,而不是四舍五入。

标签: c# double fixed-width custom-formatting


【解决方案1】:

通常这条规则适用于外汇市场,我将其开发如下:

if (number < 1)
   cell.Value = number.ToString("0.00000");
else if (number < 10)
   cell.Value = number.ToString("0.0000");
else if (number < 100)
   cell.Value = number.ToString("00.000");
else if (number < 1000)
   cell.Value = number.ToString("000.00");
else if (number < 10000)
   cell.Value = number.ToString("0000.0");
else if (number < 100000)
   cell.Value = number.ToString("00000");

【讨论】:

  • 也许第一个if (number &lt; 0)应该是if (number &lt; 1)
  • 是的,你是对的,我已经修改了它。非常感谢!
【解决方案2】:
public string FormatNumber(double number)
{
    string stringRepresentation = number.ToString();

    if (stringRepresentation.Length > 5)
        stringRepresentation = stringRepresentation.Substring(0, 5);

    if (stringRepresentation.Length == 5 && stringRepresentation.EndsWith("."))
        stringRepresentation = stringRepresentation.Substring(0, 4);

    return stringRepresentation.PadLeft(5);
}

编辑:刚刚意识到这不会在必要时在小数点末尾填充零(如在您的第一个示例中),但应该为您提供工具以根据需要完成它。

EDITx2:鉴于您打算进行舍入的最新添加,它变得更加复杂。首先,您必须检查 if 您是否有任何小数位以及小数点在什么位置。然后你必须将它四舍五入到那个小数位,然后可能会遍历输出。请注意,根据您的算法,您可能会在四舍五入的数字上得到一些不正确的结果(例如,-10.9999 可能变为 -11.00-11,具体取决于您的实现)

【讨论】:

  • 是的,这给了我我需要的东西,是的,我必须添加更多逻辑来处理舍入。不过还是谢谢你。这将带我去我需要去的地方。
【解决方案3】:

如果要在很多地方经常使用,请在 Double 上创建一个扩展方法。

using System;

public static class DoubleExtensionMethods
{
    public static string FormattedTo5(this double number)
    {
        string numberAsText = number.ToString();

        if (numberAsText.Length > 5)
        {
            numberAsText = numberAsText.Substring(0, 5);
        }

        return numberAsText.TrimEnd('.').PadLeft(5);
    }
}

然后使用是:

double myDouble = 12345.6789D;

string formattedValue = myDouble.FormattedTo5();

【讨论】:

    猜你喜欢
    • 2012-01-15
    • 2014-07-21
    • 1970-01-01
    • 2018-01-28
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多