从字符串中提取可变长度的子字符串

时间:2015-06-24 09:44:57

标签: c# .net string

我需要使用c#和.NET从字符串中提取可变长度的十进制数。输入字符串类似于$PTNTHPR,352.5,N,2.3,N,4.6,N,16*。我需要第一次出现十进制数,即352.5部分。数值范围从0.0360.0,我需要该字符串中的数字。

我搜索了很多并获得了固定长度子字符串的解决方案,但在这里我有可变长度来提取。我还没有尝试过任何代码。

4 个答案:

答案 0 :(得分:7)

如果始终采用此格式,您可以使用String.Splitdecimal.Parse

var data = @"$PTNTHPR,352.5,N,2.3,N,4.6,N,16*";
var d = decimal.Parse(data.Split(new[]{','})[1]);

Console.WriteLine(d);

这只是一个指导您的示例代码。您应该为此添加其他异常处理逻辑,还要考虑使用decimal.TryParse

如果要查找第一次出现的十进制值,则拆分字符串并逐个解析。

var data = @"$PTNTHPR,352.5,N,2.3,N,4.6,N,16*";
var splited = data.Split(new[]{','});
decimal? value = null;
foreach (var part in splited)
{
    decimal parsed;
    if (decimal.TryParse(part, out parsed))
    {
        value = parsed;
        break;
    }
}
Console.WriteLine(value);

答案 1 :(得分:1)

任何代币首次出现?使用String.Split将它们与LINQ分开以找到第一个。您可以使用decimal.TryParse检查它是否可以解析:

decimal? firstParsableToken = "$PTNTHPR,352.5,N,2.3,N,4.6,N,16*".Split(',')
    .Select(s => s.TryGetDecimal(NumberFormatInfo.InvariantInfo))
    .FirstOrDefault(d => d.HasValue);

使用这个简单的扩展方法将其解析为decimal?

public static decimal? TryGetDecimal(this string item, IFormatProvider formatProvider = null, NumberStyles nStyles = NumberStyles.Any)
{
    if (formatProvider == null) formatProvider = NumberFormatInfo.CurrentInfo;
    decimal d = 0m;
    bool success = decimal.TryParse(item, nStyles, formatProvider, out d);
    if (success)
        return d;
    else
        return null;
}

答案 2 :(得分:0)

如果字符串始终以逗号分隔,是否可以使用string.Split()获取每个部分,然后使用double.TryParse()来测试该部分是否为数字?

答案 3 :(得分:0)

public static class Helper
{
    public static string MyExtract(this string s)
    {
        return s.Split(',').First(str => Regex.IsMatch(str, @"[0-9.,]"));
    }
}

像这样使用它:string str = "$PTNTHPR,352.5,N,2.3,N,4.6,N,16*".MyExtract(); 然后,如果需要,将其转换为double / decimal。