Abhikkumar Bag
Abhikkumar Bag

Reputation: 13

Extracting a substring of variable length from a string

I need to extract a variable length decimal number from a string using c# and .NET. The input string is like $PTNTHPR,352.5,N,2.3,N,4.6,N,16*. I need the first occurrence of decimal number, i.e the 352.5 part. The numerical value ranges from 0.0 to 360.0 and I need that number from that string.

I searched a lot and got solution for a fixed length sub string but here I have variable length to extract. I have not tried with any code yet.

Upvotes: 0

Views: 1095

Answers (4)

Fabjan
Fabjan

Reputation: 13676

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

Use it like this: string str = "$PTNTHPR,352.5,N,2.3,N,4.6,N,16*".MyExtract(); Then convert it to double/decimal if you need it.

Upvotes: 0

Hamid Pourjam
Hamid Pourjam

Reputation: 20754

If it is always in this format you can use String.Split and decimal.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);

This is just a sample code to guide you. You should add additional exception handling logic to this, Also consider using decimal.TryParse

If you want to find the first occurance of decimal value you split the string and parse them one by one.

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);

Upvotes: 7

Tim Schmelter
Tim Schmelter

Reputation: 460138

First occurence in any of the tokens? Use String.Split to separate them and LINQ to find the first. You can use decimal.TryParse to check if it's parsable:

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

Used this simple extension method to parse it to 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;
}

Upvotes: 1

rodkort
rodkort

Reputation: 93

If the string is always comma separated, can you not use string.Split() to get each section, then use double.TryParse() to test if that part is numeric?

Upvotes: 0

Related Questions