Here's an idea. I leave it to you to implement it in your code as appropriate. I use string extension methods to perform the "work". If you're not familiar with extension methods, google is your friend. I also implemented some rudimentary sanity checks to avoid unneccesary processing.
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
TestFloatStringParse(true);
Console.Write("Press any key...");
Console.ReadKey();
}
private static void TestFloatStringParse(bool makeIntsFloats = false)
{
string text = "+0.1 + 1.78 * 27.5/ (5+ 0)A;";
Console.WriteLine(string.Concat("original string = ", text));
text = text.ReplaceNonNumeric(' ');
Console.WriteLine(string.Concat("new string = ", text));
if (makeIntsFloats)
{
string[] parts = text.Split(' ');
for (int i = 0; i < parts.Length; i++)
{
parts[i] = (parts[i].Contains('.')) ? parts[i] : string.Concat(parts[i], ".0");
}
text = string.Empty;
foreach (string part in parts)
{
text = string.Concat(text, part, " ");
}
text = text.Trim();
}
Console.WriteLine(string.Concat("optional string = ", text));
}
}
public static class ExtendStrings
{
private static NumberFormatInfo nfi = CultureInfo.InvariantCulture.NumberFormat;
private static string numerics = string.Join("", nfi.NativeDigits);
private static string separators = string.Concat(nfi.CurrencyDecimalSeparator,
nfi.CurrencyGroupSeparator,
nfi.NumberDecimalSeparator,
nfi.NumberGroupSeparator,
nfi.PercentDecimalSeparator,
nfi.PercentGroupSeparator);
public static string ReplaceNonNumeric(this string text, char replacement)
{
string result = text;
if (replacement != (char)0)
{
if (string.Concat(numerics, separators).Contains(replacement))
{
throw new InvalidOperationException("Replacement characters cannot include culture-specific numeric values or separators");
}
result = text.ReplaceNonNumeric(replacement.ToString());
}
return result;
}
public static string ReplaceNonNumeric(this string text, string replacement)
{
string result = text;
if (!string.IsNullOrEmpty(replacement) && !string.IsNullOrEmpty(text))
{
result = string.Empty;
foreach (char ch in text)
{
result = string.Concat(result, (ch.IsNumeric()) ? ch : ' ');
}
result = (replacement.Length == 1) ? result.ReplaceDuplicateSequentialChars(replacement[0]) : result;
result = result.Trim();
}
return result;
}
public static bool IsNumeric(this char ch)
{
bool result = (numerics.Contains(ch) || separators.Contains(ch));
return result;
}
public static string ReplaceDuplicateSequentialChars(this string text, char ch)
{
string result = text;
int length = 0;
while (true)
{
length = result.Length;
result = result.Replace(" ", " ");
if (length == result.Length)
{
break;
}
}
return result;
}
}
}