Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 哪种方法最适合获取正则表达式和%(mod)之间的十进制值?_C#_Regex_Performance - Fatal编程技术网

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