using System.Globalization;
using System.Text.RegularExpressions;
public static void Main()
string[] tests = ["123,45", "1.234,56", "15.456.789,52000", "1,234,567.8900000000", "10.00000000", "10,00000000", "123456,897827", "12978312.10231"];
foreach (var t in tests) {
decimal? res = ParseDecimal(t);
if (res != null) Console.WriteLine("RESULT: " + res);
public static decimal? ParseDecimal(string input)
if (string.IsNullOrEmpty(input.Trim()))
int dotsCount = input.Count(c => c == '.');
int commasCount = input.Count(c => c == ',');
Console.WriteLine($"INPUT: {input}\tDOTS: {dotsCount}\tCOMMAS: {commasCount}");
NumberFormatInfo dotSeparator = new NumberFormatInfo
NumberDecimalSeparator = ".",
NumberGroupSeparator = ","
NumberFormatInfo commaSeparator = new NumberFormatInfo
NumberDecimalSeparator = ",",
NumberGroupSeparator = "."
if (commasCount > 0 && dotsCount > commasCount)
result = decimal.Parse(input, commaSeparator);
if (dotsCount > 0 && commasCount > dotsCount)
result = decimal.Parse(input, dotSeparator);
if (dotsCount == 1 && commasCount == 1)
string[] commaSplit = input.Split(',');
if (commaSplit[0].Length >= commaSplit[1].Length)
result = decimal.Parse(input, commaSeparator);
result = decimal.Parse(input, dotSeparator);
if (dotsCount == 1 && commasCount == 0) {
result = decimal.Parse(input);
result = decimal.Parse(input, new CultureInfo("es-ES"));
Console.WriteLine($"ERROR: {ex.Message}");