【问题标题】:Removing any trailing zeros from a decimal in C# [duplicate]从 C# 中的小数中删除任何尾随零 [重复]
【发布时间】:2015-11-19 13:19:01
【问题描述】:

我的程序中有一个小数点,小数点后可能有尾随零,我想去掉它们。

我希望通过将小数转换为字符串并仅使用基于小数点所在位置以及小数点后的内容是否为零的子字符串来做到这一点。这是我想出的:

string number = Convert.ToString(MyDouble);
if (number.Contains("."))//If there are trailing zeros
{
    //If the numbers after the decimal point (when taken as an integer) equal 0
    if(Convert.ToInt16(number.Substring(number.IndexOf("."))) == 0)
    {
        //Remove anything after the decimal point
        number = number.Substring(0, number.Length - number.IndexOf("."));
    }
}
result = Convert.ToDecimal(number);

但这不起作用。它有什么问题?

【问题讨论】:

  • 您可以简单地使用自定义格式说明符来做到这一点(特别是,查看“#”与“0”)msdn.microsoft.com/en-us/library/0c899ak8(v=vs.110).aspx
  • 我真的不明白这是要完成什么。通常,人们会将数值简单地作为其数字(不是字符串)表示形式存储在内存中。然后在某种 UI 中显示它们时简单地应用一个字符串格式化程序。为什么要进行这次对话?
  • 您能否从示例中删除所有不相关的代码并用常量替换值:number 是主要候选者?
  • @David 我认为这是字符串操作的练习。显然,应该直接对数字进行舍入/修整(有很多现有的问题)......或者可能是为了显示数字转换为字符串的特定于语言环境的问题......
  • 如果链接的副本不涵盖所有情况 - 如果您需要小数点后的特定位数,还有更多详细信息:stackoverflow.com/questions/164926/…

标签: c# decimal


【解决方案1】:

Linq 让这很容易(如果您不想转换值):

using System;
using System.Linq;
                    
public class Program
{
  public static void Main()
  {
    var a = "10.001000";
    var b = a.Reverse().SkipWhile(i => i == '0').Reverse();
    var c = new String(b.ToArray());
        
    Console.WriteLine(a);
    Console.WriteLine(c);
  }
}

结果:

10.001000

10.001

【讨论】:

    【解决方案2】:

    ToString() 可以解决问题。这里是如何做到这一点 -

         decimal a = 122.00000m;
         string trimmed = a.ToString("#.00");
    

    如果你想摆脱所有的零,就这样做-

        decimal a = 122.00000m;
         string trimmed = a.ToString("#");
    

    因此,您可以在应用程序中将许多格式代码定义为常量,并根据需要使用它们...无需逻辑。

    【讨论】:

    • 如果 a = 122.01300 ?
    • 所以我通常在计算中进行四舍五入并在显示值之前使用 ToString 格式。
    【解决方案3】:

    我找到了解决办法。如果小数(转换为字符串时)有小数点,while 循环会一直删除最后一个字符,直到最后一个字符为 0。

    string number = Convert.ToString(MyDouble);
    if (number.Contains("."))
    {
        while(number.Substring(number.Length - 1) == "0")
        {
            number = number.Substring(0, number.Length - 1);
        }
    }
    result = Convert.ToDecimal(number);
    

    【讨论】:

    • 对于所问的问题(无论它是否适合您)真的很糟糕 - % 1 在提取小数点后的部分方面要好得多。此外,代码似乎在做与后置代码完全不同的事情——如果只有零,则原始代码试图删除零,这个——删除直到第一个非零数字的零。您可能需要编辑问题以对齐两者。
    • @AlexeiLevenkov 你是对的。但我确实用错了我的问题。我希望 2.0200 变成 2.02 以及 3.00 变成 3。
    猜你喜欢
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 2012-12-21
    • 2014-10-21
    • 2017-09-22
    • 2012-07-01
    相关资源
    最近更新 更多