当前位置: 首页 > 编程语言 > C#

解析小数并过滤右边多余的0?分享

时间:2023-04-11 10:57:55 C#

解析小数并过滤右边多余的0?从XML文件中,我收到以下格式的小数:1.1320006.000000目前我正在使用Decimal.Parse,如下所示:decimalmyDecimal=Decimal.Parse(node.Element("myElementName").Value,System.Globalization.CultureInfo.InvariantCulture);我不认为有任何标准的数字格式字符串总是省略尾随的无关紧要的零,我很担心。您可以尝试编写自己的十进制规范化方法,但这可能很棘手。使用.NET4中的BigInteger类,它是合理可行的,但如果没有它(或类似的东西),它真的非常非常困难。编辑:好的,我想这就是你想要的:usingSystem;使用System.Numerics;publicstaticclassDecimalExtensions{//为清楚起见避免隐式转换privatestaticreadonlyBigIntegerTen=newBigInteger(10);privatestaticreadonlyBigIntegerUInt32Mask=newBigInteger(0xffffffffU);publicstaticdecimalNormalize(thisdecimalinput){unchecked{int[]bits=decimal.GetBits(input);BigIntegermantissa=newBigInteger((uint)bits[0])+(newBigInteger((uint)bits[1])>16;//这里的循环条件很难看,因为我们希望//同时执行DivRem部分和指数检查:(while(exponent>0){BigIntegerremainder;BigIntegerdivided=BigInteger.DivRem(mantissa,Ten,outremainder);if(remainder!=BigInteger.Zero){break;}exponent--;mantissa=divided;}//好的,现在把它们重新放在一起...bits[3]=(exponent>=32;bits[1]=(int)(uint)(mantissa&UInt32Mask);mantissa>>=32;bits[2]=(int)(uint)(尾数&UInt32掩码);返回新的小数(位);}}classProgram{staticvoidMain(string[]args){Check(6.000m);检查(6000m);检查(6m);检查(60.00m);12345.00100米);检查(-100.00m);}staticvoidCheck(decimald){Console.WriteLine("前:{0}-后:{1}",d,d.Normalize());这将从小数点中删除所有尾随零,然后你可以使用ToString()或者如果你想要精确的精度,比如小数点后5位,首先Normalize()然后乘以1.00000m。这符合给定的示例,但是很糟糕。(我认为)myDecimal.ToString("#.######")是否还有其他要求?是否要操纵该值并显示具有该小数位数的操纵值?另一个答案涉及递归,如下所示://像这样使用:myTextbox.Text=RemoveTrailingZeroes(myDecimal.ToString());privatestringRemoveTrailingZeroes(stringinput){if(input.Contains(".")&&input.Substring(input.Length-1)=="0"){//测试最后一个字符=="0"returnRemoveTrailingZeroes(input.Substring(0,input.Length-2))//删除最后一个字符并再次递归}returninput;//否则返回原始字符串}如果你想要一个扩展方法那么这是一个选项//像这样使用:myTextbox.Text=myDecimal.ToString().RemoveTrailingZeroes();privatestringRemoveTrailingZeroes(thisstringinput){if(input.Contains(".")&&input.Substring(input.Length-1)=="0"){//测试最后一个字符=="0"returnRemoveTrailingZeroes(input.Substring(0,input.Length-2))//删除最后一个字符并再次递归}returninput;//否则返回原始字符串}添加了input.Contains(“。”)&&来自JonSkeet的评论,但请记住,如果你知道你总是有一个小数并且没有像myDecimal=6000这样的情况,这会使它变得非常慢;然后你可以放弃那个测试,或者你可以把它变成一个类并有几个私有方法,具体取决于输入是否包含小数等。我最简单,“它有效”而不是EnterpriseFizzBu??zz如果你只需要这样做是为了显示,使用自定义格式字符串怎么样?//十进制有28/29位有效数字,所以30个“#”符号应该足够p??ublicstaticreadonlystringTrimmedDecimal="0."+新字符串('#',30);//...十进制x=1.132000m;Console.WriteLine(x.ToString()+"-"+x.ToString(TrimmedDecimal));//1.132十进制y=6.000000m;Console.WriteLine(y.ToString()+"-"+y.ToString(TrimmedDecimal));//6如何在小数点上使用toString("G29")?这正是您想要实现的目标!以上就是C#学习教程:解析小数并过滤右边多余的0?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢