C# 将工程符号转换为double和REGEX,将字符串分成两部分;数字和字符
我正在尝试编写一种方法,将工程符号转换为C# 将工程符号转换为double和REGEX,将字符串分成两部分;数字和字符,c#,regex,string,C#,Regex,String,我正在尝试编写一种方法,将工程符号转换为double。我现在的情况非常特殊!我的意思是我不会去寻找像“Mega,Giga和…”这样的能力,我只是在寻找浮点 我的一些有效例子如下: 1.0a应该是1 1.0064 mA或1.0064 mA应为0.0010064注意,我将M和M计算为mili…这可以使用ToLower()方法实现。而A或A算作电流的安培数 对于电压,我有相同的情况,因此用户可以输入V或V 还有一些有效的案例: 256ma366MA10.665UA 因此,在将这个字符串传递给转换方法之
double
。我现在的情况非常特殊!我的意思是我不会去寻找像“Mega,Giga和…”这样的能力,我只是在寻找浮点
我的一些有效例子如下:
1.0a
应该是1
1.0064 mA
或1.0064 mA
应为0.0010064
注意,我将M和M计算为mili…这可以使用ToLower()
方法实现。而A或A算作电流的安培数
对于电压,我有相同的情况,因此用户可以输入V或V
还有一些有效的案例:
256ma
366MA
10.665UA
因此,在将这个字符串传递给转换方法之前,我会执行text.ToLower().Remove(“,string.Empty”)代码>这将给我留下一个简单的字符串来处理
现在,第二步是从字符中分割数字:
10.665ua
应产生10.665
和ua
,这样我就可以对照允许的字符串列表检查ua
的第一个字符,并找到功率因数
private List<string> AllowedCurrentStrings = new List<string>() { "a", "ma", "m", "ua", "u", "na", "n", "pa", "p" };
private List AllowedCurrentStrings=new List(){“a”、“ma”、“m”、“ua”、“u”、“na”、“n”、“pa”、“p”};
所以我在寻求你的帮助。首先,我需要知道如何从字符中分割数字,然后将字符分组为字符串(或者我需要执行后面的操作吗?)
或者,如果你认为我的方法不好,那就很高兴听到你提出更好的方法 您可以尝试以下方法:
public double ConvertMeasure(string measure)
{
measure = measure.ToLower().Replace(" ", "");
measure = measure.Substring(0, measure.Length - 1);
char m = measure.Last();
if (char.IsDigit(m))
return double.Parse(measure, CultureInfo.InvariantCulture);
double ret = double.Parse(measure.Substring(0, measure.Length - 1),
CultureInfo.InvariantCulture);
switch (m)
{
case 'm': return ret / 1E3;
case 'u': return ret / 1E6;
case 'n': return ret / 1E9;
case 'p': return ret / 1E12;
}
return ret;
}
虽然字符串解析可能要稍微快一点,但这当然可以通过正则表达式完成。使用regex解析字符串并使用字典选择转换因子的解决方案,在功能上与@Marco的答案基本相同,但有一些改进,将是:
public double ConvertMeasure(string measure)
{
var re = new Regex(@"(?i)(?<value>-?[\d.]+)\s*(?<multiplier>[munp]?)\s*(?<unit>[avw]*)");
var conversionFactors = new Dictionary<string, double> {
{ "", 1 },
{ "m", 1E3 },
{ "u", 1E6 },
{ "n", 1E9 },
{ "p", 1E12 } };
var m = re.Match(measure);
double value = Convert.ToDouble(m.Groups["value"].Value);
return value / conversionFactors[m.Groups["multiplier"].Value.ToLower()];
}
…然后将“a”
转换为安培的任何转换,或将“v”
转换为伏特的任何转换,等等
我没有测试过它,但我认为如果没有单元,@Marco的解决方案会崩溃(例如,如果字符串只有m
,u
,n
,或者p
,而不是mA
,ua
,nV
,等等)。我相信它会修剪单位,因为它切断了最后一个字符。如果只有一个字符(例如,u
),那么它将丢失该数据!我的解决方案不仅适用于任何单位,而且如果您希望以后支持更多单位,如Hz
、mol
、或cd
,它甚至可以工作-尽管摩尔和坎德拉在工程环境中可能不太常见
祝你好运,玩得开心 似乎OP最初希望接受1.0 mA
或1.0 m
并获得相同的结果-我是否感到困惑,或者这种解决方案在这种情况下会中断?@CodeJockey:我认为OP希望转换由双精度、可选字符(m、u等)和测量单位字符组成的任何字符串。因此,我的函数将删除最后一个字符,并根据可选字符转换为double。你认为可以吗?实际上我需要关心的是用户输入…为什么我要使用单位的列表
,是为了检查用户是否输入了有效的字符串。例如,1.005 mmA
显然不是有效字符串,应该注意。您还可以看到我有“m”
,“u”
和。。。因此,该方法应尝试找出这种特殊情况。无论如何,马可的回答解决了我遇到的大部分问题,我现在将尝试改进方法。@Sean87:我的观点是马可的解决方案将1.005 mmA
转换为0.001005
(和我的一样),但将1.005 muA
解析为0.000001005
,将倒数第二个字母字符作为乘法器。我的根本不匹配(毕竟是无效的)。Marco的解决方案将无法解析1.005 m
(因为没有倒数第二个字符),但我的解决方案将解析为0.001005
-这不是您想要的吗?@Marco-我认为列表允许的CurrentString
包括m
,u
,n
,和p
,因为他想接受类似1.005 m
的东西,并将其转换为0.001005d
。我相信其意图是接受装置的A
或V
部分,如暗示的那样(但不是必需的)。如果我的解释正确,您的解决方案将无法正确解析1.005 m
,而是实际返回1.005
——一个未转换的值。不过,我可能误解了输入要求。如前所述,我的解决方案实际上不会解析字符串,例如1.005 muA
(因为它无效)。如果您希望将其作为值接受并基于m
前缀返回转换后的双精度,则可以将正则表达式中的[avw]
更改为[a-z]
。这将取消对有效单位的检查,只允许在第一个有效乘法器(m
、u
、n
或p
)之后使用任意数量的字母(大写或小写)。
var re = new Regex(@"(?i)(?<value>-?[\d.]+)\s*(?<multiplier>[munp]?)\s*(?<unit>[" + AllowedUnits + @"]*)");