我需要使用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
是始終在','之間。 –