【问题标题】:How can I force an exception if the decimal is larger than the ToString format descriptor?如果小数大于 ToString 格式描述符,如何强制异常?
【发布时间】:2013-08-12 23:37:34
【问题描述】:

我必须使用传递给我的代码的各种格式描述符来格式化小数,这些格式描述符指定了小数点左侧的不同有效位数。每个格式描述符的 ToString 输出左侧不能有太多数字,否则我应该返回错误(格式溢出)。

是否有一些 ToString 十进制格式描述符(我找不到任何)或其他十进制到字符串的转换机制,如果小数大于为小数左侧分配的字符串空间,我可以获得异常?我希望抛出类似下面的代码而不是工作。我希望有比我在格式描述符中计数字符更优雅/内置的东西,并找出自己的最大小数是多少,并在尝试转换之前进行比较。谢谢!

    static void Main(string[] args)
    {
        string lFormat = null;
        decimal lValue = 123456.5678m;

        // For example, I would like something like this to throw because the number would not fit into 3 significant left side digits...
        lFormat = "000.00";
        Console.WriteLine("Format '{0}' value '{1}'.", lFormat, lValue.ToString(lFormat));

        Console.WriteLine("Hit Enter to exit...");
        Console.ReadLine();
    }

【问题讨论】:

  • 你可能想多了:if (lValue > 999.999m) throw ...
  • 除了格式不总是###.### 并且可能有 2 或 3 或 4 或任何有效的左数字...

标签: c# format decimal


【解决方案1】:

我不知道任何具有这种行为的方法,但是,您可以很容易地实现自己的方法。身体看起来像这样;

int significantDigits = 4;


if (MyFloat.ToString().Split('.')[1].Length > significantDigits)
    throw new Exception("That float was too high of percision.");

您可能希望改进此代码(例如,如果输入和 int 而不是 float,它将因 IndexOutOfRangeException 而崩溃)但基本思想是转换为字符串,在 . 上拆分,检查索引的长度1、超过我的限制就抛出异常。

【讨论】:

  • 谢谢。我想我可以做类似的事情,但希望它可以成为转换过程本身的一部分,使用格式描述符掩码,而不是事后比较重要的左侧数字。但如果没有更好的内置解决方案,我会选择这个。
  • @Dave 是的,如果您可以自己引用小数部分,那就太好了,但我认为这不是浮点数的真正选择。
【解决方案2】:

我决定这样做:

//检查小数是否不会溢出给定的格式

十进制 lMaxValue = decimal.Parse(new string('9', LeftPlaces) + "." + new string('9', RightPlaces));

如果 (pValue > lMaxValue) 抛出新的溢出异常();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-15
    • 2014-05-24
    • 1970-01-01
    • 2012-02-10
    • 2011-03-25
    • 2013-08-27
    • 1970-01-01
    • 2018-12-19
    相关资源
    最近更新 更多