【问题标题】:ToString() filling Decimal number with zeroes at the rightToString() 在右边用零填充十进制数
【发布时间】:2013-11-12 18:02:10
【问题描述】:

这当然是一个简单的问题,但我找不到解决方案。它与this question 正好相反。就我而言,我的 ViewModel 上有一个小数点和一个字符串属性,如下所示:

public string FactorText 
{
    get
    {
        if (this.Factor != 0)
        {
            return this.Factor.ToString();
        }
    }

    set
    {
        this._factorText = value;
    }
}

public decimal Factor { get; set; }

.ToString()起作用时,它会在右边用零填充数字,例如:

  • 1.1 变为 1.100000000000000
  • 1.9999999999 变为 1.999999999900000

... 等等。它用零填充小数点后 15 位。

我真的不知道为什么以及是否有办法确保.ToString() 停止这样做。

如果此信息是相关的,则该因子与 Fluent NHibernate 映射如下:

Map((x) => x.Factor).Column("FACTOR").Precision(30).Scale(15).Not.Nullable();

我不知道这是否是导致这种行为的原因。

谢谢你的建议。

更新:我只是无法更改比例和精度。它们与数据库定义中的列 Decimal(30,15) 匹配。

【问题讨论】:

  • 嗯,大概 NHibernate 提供了一个带有所有尾随零的 decimal 值。
  • @JonSkeet 但是当我停在此处的断点return this.Factor.ToString(); 时,因子值为1,1
  • 你的意思是在调试器中?恐怕不要假设调试器会使用与其他任何东西相同的表示。
  • @JonSkeet 是的,在调试器中。好吧,在这种情况下,我很困惑。
  • 基本上,恐怕不要相信调试器。您也许可以深入了解更多细节,但我强烈怀疑该值真的 1.100000000000000m。

标签: c# asp.net asp.net-mvc nhibernate fluent-nhibernate


【解决方案1】:

这可能是由于数据库如何表示数字。例如,如果您在 SQL Server 2008 的小数(30,15)字段中插入 1.1 并选择结果,您将返回 1.100000000000000。

请参阅下面的 cmets,接受的解决方案是使用 .ToString("G29"),如在 How to format a decimal without trailing zeros 中找到的那样

【讨论】:

  • 我怀疑过。但我不知道如何在映射或 .ToString 函数上防止这种情况发生。
  • 这个问题提供了几个选项:stackoverflow.com/questions/17516460/…。大多数应用程序在页面/表单/视图模型上使用格式字符串来显示所需的小数位。如果您只想删除尾随零,您可能必须操作 ToString 调用返回的字符串。
  • 这就是我所追求的,它适用于.ToString("G29")。使用此代码更新您的答案,我会接受。
  • 非常有趣的解决方案。但是/最有趣的是,它如何再次证明了这个事实:应该避免在没有参数的情况下调用ToString
【解决方案2】:

1.1 becomes 1.100000000000000

              ^^^^^^^^^^^^^^^ 15 places

.Scale(15) 是导致此行为的原因。将其减少到您需要的小数位数。

【讨论】:

  • 问题是我需要这个比例为 15。我不能减少它。相当于数据库中的列定义:Decimal(30,15).
【解决方案3】:

您可以使用 string.format-Parameters 之类的

string.format("{0:0.0000}",yourvalue");

【讨论】:

    【解决方案4】:

    只需删除 Scale(15) 即可加载原始值。

    【讨论】:

      【解决方案5】:

      也许这对你有用:

      if (this.Factor.Length < 15) for (int i = this.Factor.Length; i <= 15; i++) this.Factor += "0";
      

      问候,

      k

      编辑:对不起,试试这个:

      return Convert.ToDecimal(this.Factor, CultureInfo.InvariantCulture).ToString();
      

      【讨论】:

      • 我想删除那些零,而不是添加更多。
      猜你喜欢
      • 2012-09-20
      • 2011-03-10
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2023-03-22
      • 2019-03-01
      相关资源
      最近更新 更多