2015-06-24 243 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; 
} 
相關問題