在 C# 中分隔字符串中的数字和单位
Posted
技术标签:
【中文标题】在 C# 中分隔字符串中的数字和单位【英文标题】:Separating number and unit in a string in C# 【发布时间】:2016-10-03 16:41:39 【问题描述】:我必须在 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,大多数类似的问题都涉及包含空格或逗号等分隔符的字符串,但不适用于这种情况。所以我转向了正则表达式。
到目前为止,我有这个,
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 有点警惕,因为根据 this question 上公认的答案,使用 ([-]?\d*\.?\d+)
而不是 ([-]?(\d*\.)?\d+)
可能因为邪恶的 RegEx 而存在危险。但如果我包括那些额外的括号,那么我就有了一个额外的组。这会导致Split()
将123.456miles
之类的内容拆分为包含元素的数组,
emptystr, 123.456, 123., miles
这样一来,我不能确定单位 miles
在这种情况下会在 val_arr[2]
中,这是一个问题。
我在this .NET RegEx tester 上对此进行了测试。我还试图打破我的 RegEx 模式([-]?\d*\.?\d+)
,但它似乎很好并且“邪恶的 RegEx 安全”。所以我不确定我是否应该坚持我目前所做的,或者找到一个更优雅的解决方案,如果有的话。
【问题讨论】:
这和 C# 有什么关系? 天哪,对不起。我忘了说我必须用 C# 重写那个 C++ sn-p。已编辑。 C++ 代码应该是一个数字和一个单位的字符串,我只相信“英里”或“公里”(虽然可能会有变化,我不能确定这一点点)并将其分成float val
和string unit
。我正在尝试在我的 C# 代码中做类似的事情,其中 RegEx 模式会将val_in
拆分为一个字符串数组,然后我可以将val_arr[1]
作为“val”,将val_arr[2]
作为“unit”。
到目前为止,这个问题似乎很不受欢迎。如果我不够清楚,我很抱歉。 RegEx 模式应该采用 123
、123.456
和 .456
之类的东西,但不会匹配 123.
和 12.34.56
之类的东西。
一个示例输入是string val_in = 123.456miles
。在 C++ 代码中,该字符串将被拆分为 float val = 123.456
和 string unit = "miles"
。
【参考方案1】:
不是很优雅,但是你不能只寻找字符串中的第一个字母来知道你的单元从哪里开始吗?
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);
【讨论】:
注意:Char.IsLetter
检查可以替换为 RegEx
检查以解决仍被视为字母的奇怪字符以上是关于在 C# 中分隔字符串中的数字和单位的主要内容,如果未能解决你的问题,请参考以下文章