c#中分隔字符串中的数字和单位

本文关键字:单位 数字 字符串 分隔 | 更新日期: 2023-09-27 18:11:23

我必须在c#中用c++写一个等价的代码,

string val_in;
float val;
char unit[100];
val_in = NoSpace(val_in);
int nscan = sscanf(val_in.c_str(), "%f%s", &val, &unit);
if (nscan < 2) {
    return val_in; //do nothing if scan fail
}

,其中NoSpace()方法裁剪并删除val_in中的所有空格。

我在这里看了一下SO,大多数类似的问题都涉及包含分隔符(如空格或逗号)的字符串,但不适用于这种情况。所以我转向RegEx。

目前为止,我有这个

string val_in;
float val;
char[] unit = new char[100];
string[] val_arr;
val_in = NoSpace(val_in);
val_arr = Regex.Split(val_in, @"([-]?'d*'.?'d+)([a-zA-Z]+)");
val = Single.Parse(val_arr[1]);
if (val_arr.Length < 2) {
    return val_in; //do nothing if scan fail
}

它工作到目前为止,但我想知道是否有另一种方法来做到这一点?我对RegEx有点警惕,因为根据对这个问题的公认答案,由于邪恶的RegEx,使用([-]?'d*'.?'d+)而不是([-]?('d*'.)?'d+)是潜在的危险。但是如果我加上这些额外的括号,我就有了一个额外的组。这将导致Split()将类似123.456miles的内容分割成包含元素

的数组。
{emptystr, 123.456, 123., miles}

这样,我不能确定单元,在本例中miles,将在val_arr[2]中,这是一个问题。

我在这个。net RegEx测试器上测试了这个。我也试图打破我的RegEx模式,([-]?'d*'.?'d+),但它似乎很好,"邪恶的RegEx安全"。所以我不确定我是否应该坚持我目前所做的,或者找到一个更优雅的解决方案,如果有的话。

c#中分隔字符串中的数字和单位

不是很优雅,但是您不能只查找字符串中的第一个字母来知道单元开始的位置吗?

  static void SplitValAndUnit(string unsplitData)
  {
     for (int x = 0; x < unsplitData.Length; x++)
     {
        if (Char.IsLetter(unsplitData[x]))
        {
           string value = unsplitData.Substring(0, x);
           // TryParse value to whatever data type
           string unit  = unsplitData.Substring(x, unsplitData.Length - x);
        }
     }
  }