C# 哪种方法最适合获取正则表达式和%(mod)之间的十进制值?
我在金融市场工作了几年,有时我需要特别处理数值的小数部分。当我将值作为C# 哪种方法最适合获取正则表达式和%(mod)之间的十进制值?,c#,regex,performance,C#,Regex,Performance,我在金融市场工作了几年,有时我需要特别处理数值的小数部分。当我将值作为字符串获取时,我使用Regex,当我将值作为双精度或十进制获取时,我使用%、上限和功率 // with math operations to get a truncated int value from the decimal part // of a decimal or double (int)Math.Ceiling((value % 1) * Math.Pow(10D, (double)(decimalLength -
字符串
获取时,我使用Regex
,当我将值作为双精度
或十进制
获取时,我使用%
、上限和功率
// with math operations to get a truncated int value from the decimal part
// of a decimal or double
(int)Math.Ceiling((value % 1) * Math.Pow(10D, (double)(decimalLength - 1)))
// with Regex to get a truncated string value from the decimal part
// of a string
Regex.Replace(value, @"^[^.]+\.([0-9]{" + decimalLength.ToString() + "}).*$", "$1")
正如标题所描述的,问题是,女巫一号是最好的?我是否应该将我的
double
或decimal
值转换为string
,并始终使用Regex
?也许我应该将我的字符串
转换为双精度
,并始终使用数学运算?还是我用这种方法做了大量的工作?用数学函数来执行数学运算总是更好的。它不仅使代码更具可读性,还可能具有更好的性能。
因此,如评论中所述-
使用#1
:)
此外,正则表达式没有考虑到不同的区域性可能具有不同的小数分隔符。并非所有人都将1.25写为
1.25
,有些文化使用,
作为十进制分隔符,因此将其写为1,25
如果遇到这样的小数点,正则表达式将无法按预期工作。另一种(相当简单的方法)我相信人们会说它是坏的或是什么(大部分是出于无知)是将其转换为字符串,然后在小数点处拆分字符串 通过这种方式,您可以很容易地获得
十进制
值的左右部分,尽管它不会有数学运算的性能
这种方法的好处是,不需要使用Math.Pow
来获取decimal
作为一个如此大的数字,您可以在.ToString
部分处理它
int decimalPlaces = 10;
decimal number = 123456789.1234567890M;
string[] parts = number.ToString("F" + decimalPlaces).Split(System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0]);
long[] lParts = new long[parts.Length];
for (int i = 0; i < parts.Length; i++)
lParts[i] = Convert.ToInt64(parts[i]);
for (int i = 0; i < parts.Length; i++)
Console.WriteLine(lParts[i].ToString());
我不是说这永远是答案,但它肯定有它的优点。它的使用也非常简单:您所要做的就是将decimalPlaces
中的10
更改为您想要的小数位数,您将得到相同的值。(当然,您的方法也是模块化的。)
仅仅把它放在这里作为方法的另一种选择,实际上唯一的坏的方法是使用Regex
。如果希望使用字符串
,请使用常规字符串操作
更新:另外,我刚刚对Math
方法和这个string
方法做了一些基准测试,发现Math
方法可能返回稍微不准确的结果。当使用双倍数字进行测试时=9.1234567890D
string方法返回1234567890
,而Math
方法返回1234567891
。如果您需要绝对和精确的十进制值,请记住这一点。另一个问题是Math
方法不能隐式使用decimal
类型(其精度高于double
类型),必须首先将其转换为double
。然而,string
方法速度较慢。使用Math
方法需要250-300%的时间
这些只是需要记住的更多事情。第一个是首选方法。这里不需要正则表达式,除非您想使代码不可读。我想知道预期的答案是什么<代码>使用#1?:)口味不同。我认为Regex方法会比较慢。如果您试图获取
十进制数的左或右部分,另一种选择是将其转换为字符串,然后在小数点处拆分字符串。如果使用了错误的格式说明符,那么问题在于精度。我在巴西生活和工作,这里我们使用,
作为十进制分隔符。我发布的代码就是一个例子,如果我知道十进制格式。谢谢你的回答!在处理位置数据时,通常需要获取小数部分,并且大多数值的末尾都是字符串。这也是一个很好的方法;)@MFEDato纯数学方法的问题是,由于浮点错误,您可能会得到稍微不准确的结果。我过去使用十进制和双精度,我需要的最大精度是6个十进制位置,因此在.Net中工作不是一个重大问题。我在使用JavaScript时遇到过一些这样的问题,它们的精确度非常差。
123456789
1234567890