我需要使用c#和.NET从字符串中提取可变长度的十进制数字。输入字符串类似$PTNTHPR,352.5,N,2.3,N,4.6,N,16*
。我需要第一个十进制数,即352.5部分。数值范围从0.0
到360.0
,我需要那个字符串中的数字。从字符串中提取可变长度的子字符串
我搜索了很多,并得到了一个固定长度的子字符串的解决方案,但在这里我有可变长度来提取。我还没有尝试过任何代码。
我需要使用c#和.NET从字符串中提取可变长度的十进制数字。输入字符串类似$PTNTHPR,352.5,N,2.3,N,4.6,N,16*
。我需要第一个十进制数,即352.5部分。数值范围从0.0
到360.0
,我需要那个字符串中的数字。从字符串中提取可变长度的子字符串
我搜索了很多,并得到了一个固定长度的子字符串的解决方案,但在这里我有可变长度来提取。我还没有尝试过任何代码。
如果它总是在这种格式可以使用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);
谢谢你的解决方案,你的解决方案帮了我很多。我想知道我是否需要所有三位小数,然后该做什么?再次感谢。 –
如果字符串总是用逗号分隔,你能不能用string.Split()来获取每个部分,然后用double.TryParse()来测试,如果这部分是数字?
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();
然后将其转换为加倍/十进制如果你需要它。
任何令牌中的第一次出现?使用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;
}
将数量始终是介于“”?如果是这样,请使用split(',') – apomene
[String.Split方法](https://msdn.microsoft.com/en-us/library/tabh47cf(v = vs.110).aspx)和[How to:Split字符串](https://msdn.microsoft.com/en-us/library/tabh47cf(v = vs.110).aspx) – bansi
是始终在','之间。 –