コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
            }
        }