Извлечение десятичного числа из начала строки

У меня есть строка типа 5.5kg или 7.90gram, и я хочу получить 5.5 или 7.90 как десятичное значение. Как я могу получить такой результат в С# и еще одну вещь, которую моя строка всегда будет начинаться с десятичной.

Вот мой код, который выдает ошибку всякий раз, когда он сталкивается с чем-либо, кроме десятичного.

string weight = attributeValue;
if (!string.IsNullOrEmpty(weight))
{
    product.Weight = Convert.ToDecimal(attributeValue);
}
else
{
    product.Weight = 0.00m;
}

Ответ 1

Я бы создал регулярное выражение, соответствующее главной части числа. Отчасти это будет зависеть от того, будет ли вы всегда иметь десятичную точку, хотите ли вы разрешать запятые для разделителей тысяч, будет ли она всегда использовать . как десятичную точку и т.д. Это может выглядеть примерно так:

^-?\d+(?:\.\d+)?

Затем сопоставьте это регулярное выражение с текстом, возьмите значение совпадения (если оно выполнено успешно) и используйте decimal.Parse или double.Parse для этого значения:

Regex regex = new Regex(@"^-?\d+(?:\.\d+)?");
Match match = regex.Match(text);
if (match.Success)
{
    weight = decimal.Parse(match.Value, CultureInfo.InvariantCulture);
}

Обратите внимание, что для "естественных" значений, таких как масса, вам может быть лучше double, чем decimal. Последнее более подходит для "искусственных" значений, таких как валюта, которые, естественно, лучше всего выражаются в десятичной форме и имеют точные значения. Это зависит от того, что вы делаете, хотя.

Ответ 2

здесь совершенно другой подход

    string oldstr = "1.7meter";
        Char[] strarr = oldstr.ToCharArray().Where(c => Char.IsDigit(c) || Char.IsPunctuation(c)).ToArray();
        decimal number = Convert.ToDecimal( new string(strarr)); 

Ответ 3

Для вашего формата ввода вы можете получить десятичный код с помощью этого кода

var weight =Decimal.Parse( Regex.Match(input_string, "[0-9]*\\.*[0-9]*").Value);

если ваша строка ввода находится в другом формате, тогда вы должны изменить шаблон регулярного выражения.