首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将工程符号转换为double和REGEX,将字符串拆分为两部分:数字和字符

将工程符号转换为double和REGEX,将字符串拆分为两部分:数字和字符
EN

Stack Overflow用户
提问于 2011-11-22 14:22:03
回答 2查看 766关注 0票数 2

我正在尝试编写一个方法,将工程表示法转换为double。我现在的情况很特别!我是说我不会去寻找像"Mega,Giga和.“这样的超能力我只是在找浮点数。

以下是我的一些有效例子:

1.0 A应该是1

1.0064 mA1.0064 Ma应该是0.0010064注意到,我认为Mm都可以使用ToLower()方法实现mili...that。Aa算作电流安培。

对于电压,我有同样的情况,所以在这个用户中,可以输入Vv

还有一些有效的案例:256ma 366 m a 10.665 uA

最后,在将这个字符串传递给我的转换方法之前,我做text.ToLower().Remove(" ", string.Empty);,希望这会给我留下一个简单的字符串来处理。

现在第二步是从字符中分割数字:10.665ua应该导致10.665ua,这样我就可以根据允许的字符串列表检查ua的第一个字符,并找到功率因数。

代码语言:javascript
复制
private List<string> AllowedCurrentStrings = new List<string>() { "a", "ma", "m", "ua", "u", "na", "n", "pa", "p" };

所以我在寻求你的帮助。首先,我需要知道如何从字符中分割数字,然后将字符分组为字符串(还是需要执行后一个字符串?)

或者,如果你认为我的方法不好,最好能从你那里听到一个更好的方法!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-22 14:30:43

你可以试试这个:

代码语言:javascript
复制
    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;
    }
票数 2
EN

Stack Overflow用户

发布于 2011-11-22 16:44:07

虽然字符串解析可能会稍微快一点,但这当然可以用regex来完成。使用regex解析字符串的解决方案和使用字典选择转换因子的解决方案(但在功能上与@Marco的答案基本相同)如下:

代码语言:javascript
复制
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()];
}

这忽略了字符串的情况,忽略了数字与乘数和单位之间的空格(包括制表符,如果有人剪切并粘贴一个值,而不是输入它),但不忽略" number“中的空白(也就是说,1.234 mA很好,但1.2 34 mA不应该很好,但它被解析为1.234,并使用@Marco's解决方案-只需小心:D )。此外,如果有人不小心在数字前面粘贴了额外的非数字字符,例如=或周围的一组圆括号,它仍然有效。

当然,任何书面的解决方案都不会以任何方式返回实际的单元。我假设,由于您计划允许"m“、"u”等(不包括该单元),您的文本框旁边有类似"Amps“或”安培“的内容,并且希望允许某人插入任何1.3 1.3A1.3 u1.3 uA等。因此,您知道基本单元是什么--这个解决方案将提供转换功能,而忽略实际的单元。

regex中的字符类[avw]指定允许哪些单元(在本例中为av或,w)。如果要防止有人意外地将1.234 mV放入期望Amps的字段中,则可以修改函数以接受"AllowedUnits“字符串参数(如av),然后将该参数注入regex以代替avw,因此:

代码语言:javascript
复制
    var re = new Regex(@"(?i)(?<value>-?[\d.]+)\s*(?<multiplier>[munp]?)\s*(?<unit>[" + AllowedUnits + @"]*)");

...then将"a"传递给Amps的任何转换,或将"v"传递到Volts的任何转换,等等。

我还没有测试它,但我认为如果没有单元,@Marco的解决方案就会中断(例如,如果字符串只有munp而不是mAuanV等)。我相信它会修剪这个单元,因为它切断了最后一个角色。如果只有一个字符(例如u),那么它将丢失该数据!我的解决方案不仅会工作,不管单元,但它甚至会工作,如果你想以后支持更多的单位,如Hzmol,或cd -虽然鼹鼠和烛台可能不太常见的工程背景.

祝你好运,玩得开心!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8228319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档