【问题标题】:Extract decimal from start of string从字符串开头提取小数
【发布时间】:2016-11-23 21:43:03
【问题描述】:

我有一个类似5.5kg7.90gram 的字符串,我想将5.57.90 作为十进制值。我怎样才能在 C# 中得到这样的结果以及我的字符串总是以十进制开头的另一件事。

这是我的代码,只要遇到除小数以外的任何内容都会引发错误。

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

【问题讨论】:

    标签: c# .net


    【解决方案1】:

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

    ^-?\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);
    }
    

    请注意,对于质量等“自然”值,可能使用double 比使用decimal 更好。后者更适合货币等“人工”值,这些值自然最好用十进制表示并具有精确值。不过,这取决于您在做什么。

    【讨论】:

    • 由于^ 锚点,当前正则表达式将仅匹配字符串开头的浮点数/整数。要从字符串中的任何位置提取数字,请使用-?\d+(?:\.\d+)?。或[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?
    • @WiktorStribiżew:是的,因为我回答了被问到的问题:“还有一件事,我的字符串总是以十进制开头”。
    • 是的,当然,只是标题并不意味着,我认为它应该被编辑。
    【解决方案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);
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-09
        • 1970-01-01
        相关资源
        最近更新 更多