2015-06-24 180 views
0

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

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

+1

将数量始终是介于“”?如果是这样,请使用split(',') – apomene

+0

[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

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

谢谢你的解决方案,你的解决方案帮了我很多。我想知道我是否需要所有三位小数,然后该做什么?再次感谢。 –

0

如果字符串总是用逗号分隔,你能不能用string.Split()来获取每个部分,然后用double.TryParse()来测试,如果这部分是数字?

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(); 然后将其转换为加倍/十进制如果你需要它。

+0

代码只回答,如果该号码不包含'.'? – dotctor

+0

如果此字符串中的分隔符是逗号符号,则数字不能包含逗号。它只是没有意义 – Fabjan

+0

试试这个,“$ PTNTHPR,352,N,2.3,N,4.6,N,16 *”,你的代码将返回2.3而不是352 – dotctor

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; 
} 
相关问题