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安全"。所以我不确定我是否应该坚持我目前所做的,或者找到一个更优雅的解决方案,如果有的话。
不是很优雅,但是您不能只查找字符串中的第一个字母来知道单元开始的位置吗?
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);
}
}
}