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
注意,我将MM计算为mili…这可以使用
ToLower()
方法实现。而AA算作电流的安培数

对于电压,我有相同的情况,因此用户可以输入VV

还有一些有效的案例:
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 + @"]*)");