从字符串的开头提取小数

时间:2012-06-16 07:11:04

标签: c# .net

我有一个类似5.5kg7.90gram的字符串,我希望将5.57.90作为十进制值。如何在C#中获得这样的结果,还有一件事我的字符串将始终以十进制开头。

这是我的代码,只要遇到除小数之外的任何内容,就会抛出错误。

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

3 个答案:

答案 0 :(得分:28)

我会创建一个与前导数字部分匹配的正则表达式。这部分取决于你是否总是有一个小数点,是否要允许数千个分隔符使用逗号,是否总是使用.作为小数点等等。看起来像这样:

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

然后将该正则表达式与您的文字进行匹配,获取匹配的值(如果成功)并对该值使用decimal.Parsedouble.Parse

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

请注意,对于“自然”值(例如质量), 可以<{1}}比double更好。后者更适合于诸如货币之类的“人为”值,这些值自然最好用十进制表示并具有精确值。这取决于你在做什么。

答案 1 :(得分: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)); 

答案 2 :(得分:0)

  

对于您的输入格式,您可以通过此代码获得小数

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

如果您的输入字符串格式不同,则必须更改   正则表达式