我需要使用c#和.NET从字符串中提取可变长度的十进制数。输入字符串类似于$PTNTHPR,352.5,N,2.3,N,4.6,N,16*
。我需要第一次出现十进制数,即352.5部分。数值范围从0.0
到360.0
,我需要该字符串中的数字。
我搜索了很多并获得了固定长度子字符串的解决方案,但在这里我有可变长度来提取。我还没有尝试过任何代码。
答案 0 :(得分:7)
如果始终采用此格式,您可以使用String.Split和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);
这只是一个指导您的示例代码。您应该为此添加其他异常处理逻辑,还要考虑使用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。