/// <summary> /// 将文本转化为物理量 /// </summary> /// <param name="text">代表物理量的文本</param> /// <param name="successed">是否转换成功</param> /// <returns>转化后的物理量(当successed = true时有效)</returns> public static PhysicalVariable Text2Value(string text, out bool successed) { PhysicalVariable rtn = new PhysicalVariable(); string num = string.Empty; string suffix = string.Empty; int i = 0; foreach (char c in text) { if (c != ' ') { if (c != '?') { if (c != '\0') { if (c != ';') { num += c; } } } } } rtn.OriginText = num; if (text.Length < 1) { successed = false; return(rtn); } if (num.StartsWith("+")) { num = num.Remove(0, 1); } while ((num.Length > 0) && (!Microsoft.VisualBasic.Information.IsNumeric(num))) { suffix = num[num.Length - 1] + suffix; num = num.Remove(num.Length - 1, 1); } if (num == string.Empty) { successed = false; rtn.PhysicalVariableType = QuantityName.None; return(rtn); } suffix = suffix.Trim(); Symbol symbol = QuantitiesConverter.String2Symbol(suffix); switch (symbol) { case Symbol.None: break; case Symbol.VAR: suffix = suffix.Remove(suffix.Length - 3); break; case Symbol.Hz: case Symbol.VA: suffix = suffix.Remove(suffix.Length - 2); break; default: suffix = suffix.Remove(suffix.Length - 1); break; } bool percentage = suffix.StartsWith("%"); if (percentage) { suffix = suffix.Remove(0, 1); } if (PrefixsConverter.isPrefix(suffix) == false) { successed = false; rtn.PhysicalVariableType = QuantityName.None; return(rtn); } rtn.value = double.Parse(num); rtn.value *= Math.Pow(10, PrefixsConverter.prefixString2dec(suffix)); if (percentage) { rtn.value /= 100.0; } rtn.EffectiveLength = 0; i = 0; bool notZero = false; while (i < num.Length) { if (num[i] == '.') { i++; } if (i >= num.Length) { successed = false; rtn.PhysicalVariableType = QuantityName.None; return(rtn); } if (num[i] == '0') { if (notZero) { rtn.EffectiveLength++; i++; } else { i++; } } else if ((num[i] >= '1') && (num[i] <= '9')) { notZero = true; rtn.EffectiveLength++; i++; } else { i = num.Length; } } rtn.PhysicalVariableType = (QuantityName)symbol; successed = true; return(rtn); }
/// <summary> /// 将数值转换自动转换为SI词头的有效位数表示方式 /// </summary> /// <param name="value">需要转换的数值</param> /// <param name="effectiveLength">有效位数长度(必须是正整数)</param> /// <param name="noiseLevel">物理量底噪电平</param> /// <param name="prefix">数值预设词头</param> /// <param name="quantity">数值单位</param> /// <param name="percentage">百分号显示</param> /// <param name="positiveSign">正值显示+号</param> /// <returns>带有SI词头的有效位数表示方式文本</returns> public static string Value2Text(double value, int effectiveLength, int noiseLevel, string prefix, string quantity, bool percentage = false, bool positiveSign = false, bool usePrefix = true) { string rtn = string.Empty; int el = effectiveLength; if (effectiveLength < 1) { throw new Exception("有效位数需要为正整数。"); } if (double.IsNaN(value)) { return("NaN"); } if (double.IsInfinity(value)) { return("Infinity"); } if (Math.Abs(value) < 1e-24) { if (percentage) { if (noiseLevel < -2) { return(value.ToString("F" + (-noiseLevel - 2).ToString()) + "% " + quantity); } } if (usePrefix) { prefix = PrefixsConverter.dec2prefixString(PrefixsConverter.prefixString2dec(prefix) + noiseLevel + el - 1); return((0.0).ToString("F" + (PrefixsConverter.prefixString2dec(prefix) - noiseLevel).ToString()) + " " + prefix + quantity); } return(value.ToString("F" + (-noiseLevel).ToString()) + quantity); } if (value < 0) { value = -value; rtn = "-"; } else if (positiveSign) { rtn += "+"; } value *= Math.Pow(10, PrefixsConverter.prefixString2dec(prefix)); if (value > 1.0000000000000000000001) { percentage = false; } if (percentage) { value *= 100; noiseLevel += 2; } int decCnt = (int)Math.Floor(Math.Log10(value)); decCnt = (int)Math.Floor(Math.Log10(value) + decCnt / Math.Pow(10, effectiveLength - 1)); if (usePrefix) { prefix = PrefixsConverter.dec2prefixString(Math.Max(PrefixsConverter.prefixString2dec(PrefixsConverter.dec2prefixString(decCnt)), noiseLevel + effectiveLength - 1)); } else { prefix = ""; } if ((decCnt - effectiveLength + 1) < noiseLevel) { effectiveLength = decCnt - noiseLevel + 1; } if (!percentage) { if (usePrefix) { if ((decCnt - PrefixsConverter.prefixString2dec(prefix)) >= effectiveLength) { prefix = PrefixsConverter.dec2prefixString(PrefixsConverter.prefixString2dec(prefix) + 3); } } value /= Math.Pow(10, PrefixsConverter.prefixString2dec(prefix)); decCnt = (int)Math.Floor(Math.Log10(value + value * 0.5 * Math.Pow(10, -el))); value = Math.Round(value, effectiveLength - Math.Min(0, decCnt + 1), MidpointRounding.AwayFromZero); if (value < 1e-24) { if (usePrefix) { prefix = PrefixsConverter.dec2prefixString(noiseLevel + el - 1); return((0.0).ToString("F" + (PrefixsConverter.prefixString2dec(prefix) - noiseLevel).ToString()) + " " + prefix + quantity); } return(value.ToString("F" + (-noiseLevel).ToString()) + quantity); } string format; if (value >= 1) { format = "F" + Math.Max((effectiveLength - decCnt - 1), 0).ToString(); } else { format = "F" + Math.Max((effectiveLength - decCnt - 1), 0).ToString(); } rtn += value.ToString(format); if ((prefix.Length == 0) && (quantity.Length == 0)) { return(rtn); } return(rtn + " " + prefix + quantity); } else { string format = "F" + Math.Max(effectiveLength - decCnt - 1, 0).ToString(); rtn += value.ToString(format); return(rtn + "% " + quantity); } }