Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中从字母数字字符串中拆分数字部分?_C#_Winforms_Datatable - Fatal编程技术网

如何在C#中从字母数字字符串中拆分数字部分?

如何在C#中从字母数字字符串中拆分数字部分?,c#,winforms,datatable,C#,Winforms,Datatable,我以字符串的形式存储了一个值,格式为12.5PerRs。我想将此字符串分隔为12.5。为此,我尝试了这个代码 string s4 = (dataGridView1.Rows[e.RowIndex].Cells["Rate"]).Value.ToString(); string numbers = ""; string alpha = ""; foreach (char c in s4) { if (Char.IsDigit(c)) { numbers = numb

我以字符串的形式存储了一个值,格式为
12.5PerRs
。我想将此字符串分隔为
12.5
。为此,我尝试了这个代码

string s4 = (dataGridView1.Rows[e.RowIndex].Cells["Rate"]).Value.ToString();
string numbers = "";
string alpha = "";
foreach (char c in s4)
{
    if (Char.IsDigit(c))
    {
        numbers = numbers + c;
    }
    else if (Char.IsLetter(c))
    {
        alpha = alpha + c;
    }
}          
假设
string s4=“12.5RsPer
具有此值,但使用我已实现的此代码,我将得到
125
,因为这不是预期的结果

我应该怎么做才能按所需的方式拆分此值?

也许这会有所帮助

if (Char.IsDigit(c) || (c == ".") || (c == ","))
{
  numbers += c;
}
像这样试试

string value = "125.5PerRs";
Decimal dValue = 0;
for (int i=0; i<value.Length;i++)
{
   if (!Char.IsDigit(value[i]) && value[i] != '.')
   {
     dValue = Convert.ToDecimal(value.Substring(0,i));
     break;
   }
}

点不是字母,这就是返回false的原因:
Char.islitter('.')
。它是一个标点字符,属于不同的类别。您需要
Char.ispuncuation('.')
。但是不同的区域性使用不同的十进制分隔符,因此这种方法不是很可靠

所以你可以用这个方法:

public static decimal? ExtractNumberFromStart(string input, NumberFormatInfo nfi = null)
{
    if (nfi == null) nfi = NumberFormatInfo.CurrentInfo;
    char sep = nfi.NumberDecimalSeparator[0]; // no culture uses multiple characters as separator
    var numberPart = input.TrimStart().TakeWhile(c => Char.IsDigit(c) || c == sep);
    decimal dec;
    if (decimal.TryParse(string.Concat(numberPart), NumberStyles.Number, nfi, out dec))
        return dec;
    else
        return null;
}
您的样本:

string input = "12.5PerRs";
decimal? dec = ExtractNumberFromStart(input);
if (dec.HasValue)
{
    string number = dec.ToString();                // 12.5
    string alpha = input.Substring(number.Length); // PerRs
}

您可以使用正则表达式,它将匹配字符串上的每个numberDotNumber

 Regex regex = new Regex(@"([1-9])+(\.)+([1-9])");
 Match match = regex.Match(s);
 if (match.Success)
 {
    value = decimal.Parse(match.Value);
 }

+如果OP为当前区域性指定了货币符号,则可以从字符串值中获取货币标记。
 Regex regex = new Regex(@"([1-9])+(\.)+([1-9])");
 Match match = regex.Match(s);
 if (match.Success)
 {
    value = decimal.Parse(match.Value);
 }