Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.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#Regex替换无效字符,使其成为完美浮点数_C#_Regex - Fatal编程技术网

C#Regex替换无效字符,使其成为完美浮点数

C#Regex替换无效字符,使其成为完美浮点数,c#,regex,C#,Regex,例如,如果字符串为“-234.24234.-23423.344” 结果应为“-234.242342344” 如果字符串为“898.4.44.4” 结果应该是“898.4444” 如果字符串为“-898.4.-” 结果应为“-898.4” 结果应始终使场景成为双重类型 我能做的是: string pattern = String.Format(@"[^\d\{0}\{1}]", NumberFormatInfo.CurrentInfo.NumberDecimalSeparator, Numbe

例如,如果字符串为“-234.24234.-23423.344” 结果应为“-234.242342344”

如果字符串为“898.4.44.4” 结果应该是“898.4444”

如果字符串为“-898.4.-” 结果应为“-898.4”

结果应始终使场景成为双重类型

我能做的是:

string pattern = String.Format(@"[^\d\{0}\{1}]", 
NumberFormatInfo.CurrentInfo.NumberDecimalSeparator, 
NumberFormatInfo.CurrentInfo.NegativeSign);

string result = Regex.Replace(value, pattern, string.Empty); 
// this will not be able to deal with something like this "-.3-46821721.114.4"

有什么完美的方法来处理这些情况吗?

使用regex本身来实现您的目标不是一个好主意,因为regex缺少表达逻辑

尝试下面的代码,它也会做同样的事情

var str = @"-.3-46821721.114.4";
var beforeHead = "";
var afterHead = "";

var validHead = new Regex(@"(\d\.)" /* use @"\." if you think "-.5" is also valid*/, RegexOptions.Compiled);
Regex.Replace(str, @"[^0-9\.-]", "");
var match = validHead.Match(str);

beforeHead = str.Substring(0, str.IndexOf(match.Value));
if (beforeHead[0] == '-')
{
    beforeHead = '-' + Regex.Replace(beforeHead, @"[^0-9]", "");
}
else
{
    beforeHead = Regex.Replace(beforeHead, @"[^0-9]", "");
}
afterHead = Regex.Replace(str.Substring(beforeHead.Length + 2 /* 1, if you use \. as head*/), @"[^0-9]", "");

var validFloatNumber = beforeHead + match.Value + afterHead;

操作前必须修剪字符串。

这可能是个坏主意,但您可以使用正则表达式这样做:

Regex.Replace(input, @"[^-.0-9]|(?<!^)-|(?<=\..*)\.", "")

Regex.Replace(输入,@“[^-.0-9]|(?你从哪里得到这种毫无意义的输入,为什么你首先要将其视为有效的?听起来你只想保留一个符号和一个小数点分隔符。没有正则表达式,这是可行的,你似乎过早地认为正则表达式是解决这一问题的方法。但是,考虑到输入的糟糕程度?它用于masktextbox,以防止用户粘贴无意义的输入。@tianxu0836,您并没有阻止任何事情。您正在尝试优雅地恢复,而不知道这是否可能。省得自己头疼,只接受易读的输入。如果您想防止无意义的输入,我推荐bzlmn只需检查用户输入是否为正确的十进制数,不要试图假设用户输入的内容在一开始是毫无意义的。
[^-.0-9]    # anything which isn't ., -, or a digit.
|           # or
(?<!^)-     # a - which is not at the start of the string
|           # or
(?<=\..*)\. # a dot which is not the first dot in the string