我正在尝试编写一个方法,将工程表示法转换为double。我现在的情况很特别!我是说我不会去寻找像"Mega,Giga和.“这样的超能力我只是在找浮点数。
以下是我的一些有效例子:
1.0 A应该是1
1.0064 mA或1.0064 Ma应该是0.0010064注意到,我认为M和m都可以使用ToLower()方法实现mili...that。A或a算作电流安培。
对于电压,我有同样的情况,所以在这个用户中,可以输入V或v。
还有一些有效的案例:256ma 366 m a 10.665 uA
最后,在将这个字符串传递给我的转换方法之前,我做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" };所以我在寻求你的帮助。首先,我需要知道如何从字符中分割数字,然后将字符分组为字符串(还是需要执行后一个字符串?)
或者,如果你认为我的方法不好,最好能从你那里听到一个更好的方法!
发布于 2011-11-22 14:30:43
你可以试试这个:
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;
}发布于 2011-11-22 16:44:07
虽然字符串解析可能会稍微快一点,但这当然可以用regex来完成。使用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()];
}这忽略了字符串的情况,忽略了数字与乘数和单位之间的空格(包括制表符,如果有人剪切并粘贴一个值,而不是输入它),但不忽略" number“中的空白(也就是说,1.234 mA很好,但1.2 34 mA不应该很好,但它被解析为1.234,并使用@Marco's解决方案-只需小心:D )。此外,如果有人不小心在数字前面粘贴了额外的非数字字符,例如=或周围的一组圆括号,它仍然有效。
当然,任何书面的解决方案都不会以任何方式返回实际的单元。我假设,由于您计划允许"m“、"u”等(不包括该单元),您的文本框旁边有类似"Amps“或”安培“的内容,并且希望允许某人插入任何1.3 1.3A、1.3 u或1.3 uA等。因此,您知道基本单元是什么--这个解决方案将提供转换功能,而忽略实际的单元。
regex中的字符类[avw]指定允许哪些单元(在本例中为a、v或,w)。如果要防止有人意外地将1.234 mV放入期望Amps的字段中,则可以修改函数以接受"AllowedUnits“字符串参数(如a或v),然后将该参数注入regex以代替avw,因此:
var re = new Regex(@"(?i)(?<value>-?[\d.]+)\s*(?<multiplier>[munp]?)\s*(?<unit>[" + AllowedUnits + @"]*)");...then将"a"传递给Amps的任何转换,或将"v"传递到Volts的任何转换,等等。
我还没有测试它,但我认为如果没有单元,@Marco的解决方案就会中断(例如,如果字符串只有m、u、n或p而不是mA、ua、nV等)。我相信它会修剪这个单元,因为它切断了最后一个角色。如果只有一个字符(例如u),那么它将丢失该数据!我的解决方案不仅会工作,不管单元,但它甚至会工作,如果你想以后支持更多的单位,如Hz,mol,或cd -虽然鼹鼠和烛台可能不太常见的工程背景.
祝你好运,玩得开心!
https://stackoverflow.com/questions/8228319
复制相似问题