Engineering notation in C#?

前端 未结 9 2175
离开以前
离开以前 2020-12-03 17:44

Is there any code out there (or a built-in function) which allows outputting a floating point number in engineering notation?

For example, 1.5e-4 would

相关标签:
9条回答
  • 2020-12-03 18:24

    I came here looking for a function that can take any numeric representation e.g. signed/unsigned int, float, double, decimal, numeric string, and while I found some inspiration Patrick McDonald's answer, I didn't find the full answer I was looking for, so I wrote my own solution that takes a numeric string, which can be obtained easily from any numeric type. I am sharing my solution in this thread for others to use if they wish to have something more generic:

    public static string ToEngineeringNotation(string originalString, int? significantFigures = null)
    {
      var str = originalString;
    
      // remove spaces and negative sign
    
      str.Replace(" ", "");
      string prefix = "";
      if (str[0] == '-')
      {
        str = str.Substring(1);
        prefix = "-";
      }
    
      // Get the exponent, remove the exponent nomenclature
    
      int exponent = 0;
      int exponentStrIndex = 0;
      if ((exponentStrIndex = str.IndexOfAny("Ee".ToArray())) >= 0)
      {
        string exponentStr = str.Substring(exponentStrIndex + 1);
        str = str.Substring(0, exponentStrIndex);
        Int32.TryParse(exponentStr, out exponent);
      }
    
      // remove the decimal point, and adjust the exponent so the decimal point
      // should go just after the first digit, and trim trailing zeros
    
      int currentDecimalPosition = str.IndexOf('.');
      if (currentDecimalPosition >= 0)
      {
        exponent += currentDecimalPosition-1;
        str = str.Replace(".", "");
      }
      else
      {
        exponent += str.Length - 1;
      }
      str = str.TrimEnd('0');
    
      // At this point we should only have digits, just return the original string if we don't
    
      if (!str.All(char.IsDigit))
      {
        return originalString;
      }
    
      // Trim leading zeros, the decimal point is effectively moved as it's
      // just after the first digit, so adjust the exponent
    
      int lengthBefore = str.Length;
      str = str.TrimStart('0');
      exponent += str.Length-lengthBefore;
    
      // Put the decimal point back in, but move the decimal point right
      // according to the shift worked out above.
    
      if (significantFigures.HasValue && significantFigures.Value < str.Length)
      {
        if (str.Length >= significantFigures.Value && str[significantFigures.Value] >= '5' && Int64.TryParse(str.Substring(0, significantFigures.Value), out var integerValue))
        {
          // Need to round up
          str = (integerValue + 1).ToString();
          if(str.Length> significantFigures.Value)
          {
            ++exponent;
          }
        }
        str = str.Substring(0, significantFigures.Value);
      }
    
      // work out how much we need to shift the decimal point to get
      // engineering notation
    
      var decimalShiftRequired = exponent % 3;
      if (decimalShiftRequired < 0)
        decimalShiftRequired += 3;
    
      if (exponent == 0)
      {
        decimalShiftRequired = 0;
      }
      str = str.PadRight(1 + decimalShiftRequired, '0');
      str = $"{str.Substring(0, 1 + decimalShiftRequired)}.{str.Substring(1 + decimalShiftRequired)}";
      exponent -= decimalShiftRequired;
    
      // Remove the decimal point if there are no digits after it
      str = str.TrimEnd('.');
    
      // Create a default suffix consisting of the exponent
      string suffix = exponent != 0 ? $"E{(exponent < 0 ? "" : "+")}{exponent}" : "";
    
      // Work out which letter to put on the end, if any. If no letter is found,
      // then the Exponent suffix above will be added without modification
    
      switch (exponent)
      {
        case 3:
          suffix = "k"; break;
        case 6:
          suffix = "M"; break;
        case 9:
          suffix = "G"; break;
        case 12:
          suffix = "T"; break;
        case 15:
          suffix = "P"; break;
        case 18:
          suffix = "E"; break;
        case 21:
          suffix = "Z"; break;
        case 24:
          suffix = "Y"; break;
        case -3:
          suffix = "m"; break;
        case -6:
          suffix = "μ"; break;
        case -9:
          suffix = "n"; break;
        case -12:
          suffix = "p"; break;
        case -15:
          suffix = "f"; break;
        case -18:
          suffix = "a"; break;
        case -21:
          suffix = "z"; break;
        case -24:
          suffix = "y"; break;
      }
      return $"{prefix}{str}{suffix}";
    }
    

    Here's the comment block that goes at the top of the above function, I've put it here at the end so people don't have to scroll through it to get to the code:

    /// <summary>
    /// Converts a numeric string to Engineering Notation
    /// </summary>
    /// <example>
    /// class Program
    /// {
    ///   static void Main(string[] args)
    ///   {
    ///     foreach(var a in SampleNumbers)
    ///     {
    ///        var leftPad = a < 0 ? "" : " ";
    ///        var rightPad = a < 0 ? "--> " : "-> ";
    ///        var original = $"{leftPad}{a.ToString().PadRight(22)}{rightPad}";
    ///        var engineering = $"{leftPad}{a.ToEngineeringNotation(256).PadRight(22)}{rightPad}";
    ///        var engineering3Figures = $"{leftPad}{a.ToEngineeringNotation(3)}";
    ///        Console.WriteLine($"/// {original}{engineering}{engineering3Figures}");
    ///     }
    ///     Console.ReadLine();
    ///   }
    ///     
    ///   private static IEnumerable<double> SampleNumbers
    ///   {
    ///     get
    ///     {
    ///       var testValues = new[]
    ///       {
    ///         Double.NaN,
    ///         Double.Epsilon,
    ///         Double.MinValue,
    ///         Double.MaxValue,
    ///         Double.NegativeInfinity,
    ///         Double.PositiveInfinity,
    ///         -300,
    ///         -30,
    ///         -1.1,
    ///         -1,
    ///         -0.1,
    ///         -0.01,
    ///         -0.001,
    ///         -0.0001,
    ///         0,
    ///         0.0001,
    ///         0.001,
    ///         0.01,
    ///         0.1,
    ///         1,
    ///         1.1,
    ///         30,
    ///         300
    ///       };
    ///  
    ///       foreach (double a in testValues)
    ///       {
    ///         yield return a;
    ///       }
    ///       for (int i = 28; i >= -28; --i)
    ///       {
    ///         yield return Math.Pow(10, i) * -9.995567890123;
    ///         yield return Math.Pow(10, i) * -1.234567890123;
    ///         yield return Math.Pow(10, i) * -1.235567890123;
    ///       }
    ///       for (int i = -28; i <= 28; ++i)
    ///       {
    ///         yield return Math.Pow(10, i) * 9.995567890123;
    ///         yield return Math.Pow(10, i) * 1.234567890123;
    ///         yield return Math.Pow(10, i) * 1.235567890123;
    ///       }
    ///     }
    ///   }
    /// }
    /// Gives the following output
    /// 
    ///  NaN                   ->  NaN                   ->  NaN
    ///  5E-324                ->  5E-324                ->  5E-324
    /// -1.7976931348623157E+308--> -179.76931348623157E+306--> -180E+306
    ///  1.7976931348623157E+308->  179.76931348623157E+306->  180E+306
    /// -8                    --> -8                    --> -8
    ///  8                     ->  8                     ->  8
    /// -300                  --> -300                  --> -300
    /// -30                   --> -30                   --> -30
    /// -1.1                  --> -1.1                  --> -1.1
    /// -1                    --> -1                    --> -1
    /// -0.1                  --> -100m                 --> -100m
    /// -0.01                 --> -10m                  --> -10m
    /// -0.001                --> -1m                   --> -1m
    /// -0.0001               --> -100µ                 --> -100µ
    ///  0                     ->  0                     ->  0
    ///  0.0001                ->  100µ                  ->  100µ
    ///  0.001                 ->  1m                    ->  1m
    ///  0.01                  ->  10m                   ->  10m
    ///  0.1                   ->  100m                  ->  100m
    ///  1                     ->  1                     ->  1
    ///  1.1                   ->  1.1                   ->  1.1
    ///  30                    ->  30                    ->  30
    ///  300                   ->  300                   ->  300
    /// -9.995567890123E+28   --> -99.95567890123E+27   --> -100E+27
    /// -1.2345678901229999E+28--> -12.345678901229999E+27--> -12.3E+27
    /// -1.235567890123E+28   --> -12.35567890123E+27   --> -12.4E+27
    /// -9.995567890123E+27   --> -9.995567890123E+27   --> -10.0E+27
    /// -1.234567890123E+27   --> -1.234567890123E+27   --> -1.23E+27
    /// -1.2355678901230001E+27--> -1.2355678901230001E+27--> -1.24E+27
    /// -9.995567890123001E+26--> -999.5567890123001Y   --> -1.00E+27
    /// -1.234567890123E+26   --> -123.4567890123Y      --> -123Y
    /// -1.2355678901230002E+26--> -123.55678901230002Y  --> -124Y
    /// -9.995567890123001E+25--> -99.95567890123001Y   --> -100Y
    /// -1.234567890123E+25   --> -12.34567890123Y      --> -12.3Y
    /// -1.2355678901230002E+25--> -12.355678901230002Y  --> -12.4Y
    /// -9.995567890123001E+24--> -9.995567890123001Y   --> -10.0Y
    /// -1.234567890123E+24   --> -1.234567890123Y      --> -1.23Y
    /// -1.235567890123E+24   --> -1.235567890123Y      --> -1.24Y
    /// -9.995567890123001E+23--> -999.5567890123001Z   --> -1.00Y
    /// -1.234567890123E+23   --> -123.4567890123Z      --> -123Z
    /// -1.2355678901230002E+23--> -123.55678901230002Z  --> -124Z
    /// -9.995567890123E+22   --> -99.95567890123Z      --> -100Z
    /// -1.234567890123E+22   --> -12.34567890123Z      --> -12.3Z
    /// -1.235567890123E+22   --> -12.35567890123Z      --> -12.4Z
    /// -9.995567890123001E+21--> -9.995567890123001Z   --> -10.0Z
    /// -1.2345678901229999E+21--> -1.2345678901229999Z  --> -1.23Z
    /// -1.235567890123E+21   --> -1.235567890123Z      --> -1.24Z
    /// -9.995567890123E+20   --> -999.5567890123E      --> -1.00Z
    /// -1.2345678901229999E+20--> -123.45678901229999E  --> -123E
    /// -1.235567890123E+20   --> -123.5567890123E      --> -124E
    /// -9.995567890123001E+19--> -99.95567890123001E   --> -100E
    /// -1.234567890123E+19   --> -12.34567890123E      --> -12.3E
    /// -1.235567890123E+19   --> -12.35567890123E      --> -12.4E
    /// -9.995567890123E+18   --> -9.995567890123E      --> -10.0E
    /// -1.234567890123E+18   --> -1.234567890123E      --> -1.23E
    /// -1.235567890123E+18   --> -1.235567890123E      --> -1.24E
    /// -9.995567890123E+17   --> -999.5567890123P      --> -1.00E
    /// -1.234567890123E+17   --> -123.4567890123P      --> -123P
    /// -1.235567890123E+17   --> -123.5567890123P      --> -124P
    /// -99955678901230000    --> -99.95567890123P      --> -100P
    /// -12345678901230000    --> -12.34567890123P      --> -12.3P
    /// -12355678901230000    --> -12.35567890123P      --> -12.4P
    /// -9995567890123000     --> -9.995567890123P      --> -10.0P
    /// -1234567890123000     --> -1.234567890123P      --> -1.23P
    /// -1235567890123000     --> -1.235567890123P      --> -1.24P
    /// -999556789012300      --> -999.5567890123T      --> -1.00P
    /// -123456789012300      --> -123.4567890123T      --> -123T
    /// -123556789012300      --> -123.5567890123T      --> -124T
    /// -99955678901230       --> -99.95567890123T      --> -100T
    /// -12345678901230       --> -12.34567890123T      --> -12.3T
    /// -12355678901230       --> -12.35567890123T      --> -12.4T
    /// -9995567890123        --> -9.995567890123T      --> -10.0T
    /// -1234567890123        --> -1.234567890123T      --> -1.23T
    /// -1235567890123        --> -1.235567890123T      --> -1.24T
    /// -999556789012.3       --> -999.5567890123G      --> -1.00T
    /// -123456789012.29999   --> -123.45678901229999G  --> -123G
    /// -123556789012.3       --> -123.5567890123G      --> -124G
    /// -99955678901.23001    --> -99.95567890123001G   --> -100G
    /// -12345678901.23       --> -12.34567890123G      --> -12.3G
    /// -12355678901.230001   --> -12.355678901230001G  --> -12.4G
    /// -9995567890.123001    --> -9.995567890123001G   --> -10.0G
    /// -1234567890.123       --> -1.234567890123G      --> -1.23G
    /// -1235567890.1230001   --> -1.2355678901230001G  --> -1.24G
    /// -999556789.0123       --> -999.5567890123M      --> -1.00G
    /// -123456789.0123       --> -123.4567890123M      --> -123M
    /// -123556789.0123       --> -123.5567890123M      --> -124M
    /// -99955678.90123       --> -99.95567890123M      --> -100M
    /// -12345678.90123       --> -12.34567890123M      --> -12.3M
    /// -12355678.90123       --> -12.35567890123M      --> -12.4M
    /// -9995567.890123       --> -9.995567890123M      --> -10.0M
    /// -1234567.890123       --> -1.234567890123M      --> -1.23M
    /// -1235567.8901230001   --> -1.2355678901230001M  --> -1.24M
    /// -999556.7890123001    --> -999.5567890123001k   --> -1.00M
    /// -123456.7890123       --> -123.4567890123k      --> -123k
    /// -123556.78901230001   --> -123.55678901230001k  --> -124k
    /// -99955.67890123       --> -99.95567890123k      --> -100k
    /// -12345.67890123       --> -12.34567890123k      --> -12.3k
    /// -12355.678901230001   --> -12.355678901230001k  --> -12.4k
    /// -9995.567890123       --> -9.995567890123k      --> -10.0k
    /// -1234.5678901229999   --> -1.2345678901229999k  --> -1.23k
    /// -1235.567890123       --> -1.235567890123k      --> -1.24k
    /// -999.5567890123001    --> -999.5567890123001    --> -1.00k
    /// -123.45678901229999   --> -123.45678901229999   --> -123
    /// -123.5567890123       --> -123.5567890123       --> -124
    /// -99.95567890123       --> -99.95567890123       --> -100
    /// -12.345678901229999   --> -12.345678901229999   --> -12.3
    /// -12.35567890123       --> -12.35567890123       --> -12.4
    /// -9.995567890123       --> -9.995567890123       --> -10.0
    /// -1.234567890123       --> -1.234567890123       --> -1.23
    /// -1.235567890123       --> -1.235567890123       --> -1.24
    /// -0.9995567890123      --> -999.5567890123m      --> -1.00
    /// -0.1234567890123      --> -123.4567890123m      --> -123m
    /// -0.12355678901230001  --> -123.55678901230001m  --> -124m
    /// -0.09995567890123001  --> -99.95567890123001m   --> -100m
    /// -0.01234567890123     --> -12.34567890123m      --> -12.3m
    /// -0.01235567890123     --> -12.35567890123m      --> -12.4m
    /// -0.009995567890123    --> -9.995567890123m      --> -10.0m
    /// -0.001234567890123    --> -1.234567890123m      --> -1.23m
    /// -0.0012355678901230002--> -1.2355678901230002m  --> -1.24m
    /// -0.0009995567890123001--> -999.5567890123001µ   --> -1.00m
    /// -0.0001234567890123   --> -123.4567890123µ      --> -123µ
    /// -0.0001235567890123   --> -123.5567890123µ      --> -124µ
    /// -9.995567890123001E-05--> -99.95567890123001µ   --> -100µ
    /// -1.234567890123E-05   --> -12.34567890123µ      --> -12.3µ
    /// -1.2355678901230002E-05--> -12.355678901230002µ  --> -12.4µ
    /// -9.995567890123E-06   --> -9.995567890123µ      --> -10.0µ
    /// -1.234567890123E-06   --> -1.234567890123µ      --> -1.23µ
    /// -1.235567890123E-06   --> -1.235567890123µ      --> -1.24µ
    /// -9.995567890123E-07   --> -999.5567890123n      --> -1.00µ
    /// -1.234567890123E-07   --> -123.4567890123n      --> -123n
    /// -1.235567890123E-07   --> -123.5567890123n      --> -124n
    /// -9.995567890123E-08   --> -99.95567890123n      --> -100n
    /// -1.234567890123E-08   --> -12.34567890123n      --> -12.3n
    /// -1.2355678901230001E-08--> -12.355678901230001n  --> -12.4n
    /// -9.995567890123E-09   --> -9.995567890123n      --> -10.0n
    /// -1.234567890123E-09   --> -1.234567890123n      --> -1.23n
    /// -1.2355678901230001E-09--> -1.2355678901230001n  --> -1.24n
    /// -9.995567890123E-10   --> -999.5567890123p      --> -1.00n
    /// -1.234567890123E-10   --> -123.4567890123p      --> -123p
    /// -1.235567890123E-10   --> -123.5567890123p      --> -124p
    /// -9.995567890123E-11   --> -99.95567890123p      --> -100p
    /// -1.2345678901229998E-11--> -12.345678901229998p  --> -12.3p
    /// -1.235567890123E-11   --> -12.35567890123p      --> -12.4p
    /// -9.995567890123E-12   --> -9.995567890123p      --> -10.0p
    /// -1.2345678901229999E-12--> -1.2345678901229999p  --> -1.23p
    /// -1.235567890123E-12   --> -1.235567890123p      --> -1.24p
    /// -9.995567890123E-13   --> -999.5567890123f      --> -1.00p
    /// -1.234567890123E-13   --> -123.4567890123f      --> -123f
    /// -1.2355678901230002E-13--> -123.55678901230002f  --> -124f
    /// -9.995567890123001E-14--> -99.95567890123001f   --> -100f
    /// -1.2345678901229999E-14--> -12.345678901229999f  --> -12.3f
    /// -1.235567890123E-14   --> -12.35567890123f      --> -12.4f
    /// -9.995567890123002E-15--> -9.995567890123002f   --> -10.0f
    /// -1.234567890123E-15   --> -1.234567890123f      --> -1.23f
    /// -1.2355678901230002E-15--> -1.2355678901230002f  --> -1.24f
    /// -9.995567890123E-16   --> -999.5567890123a      --> -1.00f
    /// -1.234567890123E-16   --> -123.4567890123a      --> -123a
    /// -1.2355678901230001E-16--> -123.55678901230001a  --> -124a
    /// -9.995567890123001E-17--> -99.95567890123001a   --> -100a
    /// -1.234567890123E-17   --> -12.34567890123a      --> -12.3a
    /// -1.2355678901230001E-17--> -12.355678901230001a  --> -12.4a
    /// -9.995567890123002E-18--> -9.995567890123002a   --> -10.0a
    /// -1.234567890123E-18   --> -1.234567890123a      --> -1.23a
    /// -1.2355678901230002E-18--> -1.2355678901230002a  --> -1.24a
    /// -9.995567890123E-19   --> -999.5567890123z      --> -1.00a
    /// -1.2345678901229999E-19--> -123.45678901229999z  --> -123z
    /// -1.235567890123E-19   --> -123.5567890123z      --> -124z
    /// -9.995567890123E-20   --> -99.95567890123z      --> -100z
    /// -1.2345678901229999E-20--> -12.345678901229999z  --> -12.3z
    /// -1.235567890123E-20   --> -12.35567890123z      --> -12.4z
    /// -9.995567890122999E-21--> -9.995567890122999z   --> -10.0z
    /// -1.2345678901229998E-21--> -1.2345678901229998z  --> -1.23z
    /// -1.2355678901229999E-21--> -1.2355678901229999z  --> -1.24z
    /// -9.995567890123002E-22--> -999.5567890123002y   --> -1.00z
    /// -1.234567890123E-22   --> -123.4567890123y      --> -123y
    /// -1.235567890123E-22   --> -123.5567890123y      --> -124y
    /// -9.995567890123E-23   --> -99.95567890123y      --> -100y
    /// -1.2345678901229999E-23--> -12.345678901229999y  --> -12.3y
    /// -1.235567890123E-23   --> -12.35567890123y      --> -12.4y
    /// -9.995567890123E-24   --> -9.995567890123y      --> -10.0y
    /// -1.234567890123E-24   --> -1.234567890123y      --> -1.23y
    /// -1.235567890123E-24   --> -1.235567890123y      --> -1.24y
    /// -9.995567890123E-25   --> -999.5567890123E-27   --> -1.00y
    /// -1.234567890123E-25   --> -123.4567890123E-27   --> -123E-27
    /// -1.2355678901230002E-25--> -123.55678901230002E-27--> -124E-27
    /// -9.995567890123E-26   --> -99.95567890123E-27   --> -100E-27
    /// -1.234567890123E-26   --> -12.34567890123E-27   --> -12.3E-27
    /// -1.2355678901230001E-26--> -12.355678901230001E-27--> -12.4E-27
    /// -9.995567890123001E-27--> -9.995567890123001E-27--> -10.0E-27
    /// -1.2345678901229999E-27--> -1.2345678901229999E-27--> -1.23E-27
    /// -1.2355678901230001E-27--> -1.2355678901230001E-27--> -1.24E-27
    /// -9.995567890123E-28   --> -999.5567890123E-30   --> -1.00E-27
    /// -1.2345678901229998E-28--> -123.45678901229998E-30--> -123E-30
    /// -1.235567890123E-28   --> -123.5567890123E-30   --> -124E-30
    ///  9.995567890123E-28    ->  999.5567890123E-30    ->  1.00E-27
    ///  1.2345678901229998E-28->  123.45678901229998E-30->  123E-30
    ///  1.235567890123E-28    ->  123.5567890123E-30    ->  124E-30
    ///  9.995567890123001E-27 ->  9.995567890123001E-27 ->  10.0E-27
    ///  1.2345678901229999E-27->  1.2345678901229999E-27->  1.23E-27
    ///  1.2355678901230001E-27->  1.2355678901230001E-27->  1.24E-27
    ///  9.995567890123E-26    ->  99.95567890123E-27    ->  100E-27
    ///  1.234567890123E-26    ->  12.34567890123E-27    ->  12.3E-27
    ///  1.2355678901230001E-26->  12.355678901230001E-27->  12.4E-27
    ///  9.995567890123E-25    ->  999.5567890123E-27    ->  1.00y
    ///  1.234567890123E-25    ->  123.4567890123E-27    ->  123E-27
    ///  1.2355678901230002E-25->  123.55678901230002E-27->  124E-27
    ///  9.995567890123E-24    ->  9.995567890123y       ->  10.0y
    ///  1.234567890123E-24    ->  1.234567890123y       ->  1.23y
    ///  1.235567890123E-24    ->  1.235567890123y       ->  1.24y
    ///  9.995567890123E-23    ->  99.95567890123y       ->  100y
    ///  1.2345678901229999E-23->  12.345678901229999y   ->  12.3y
    ///  1.235567890123E-23    ->  12.35567890123y       ->  12.4y
    ///  9.995567890123002E-22 ->  999.5567890123002y    ->  1.00z
    ///  1.234567890123E-22    ->  123.4567890123y       ->  123y
    ///  1.235567890123E-22    ->  123.5567890123y       ->  124y
    ///  9.995567890122999E-21 ->  9.995567890122999z    ->  10.0z
    ///  1.2345678901229998E-21->  1.2345678901229998z   ->  1.23z
    ///  1.2355678901229999E-21->  1.2355678901229999z   ->  1.24z
    ///  9.995567890123E-20    ->  99.95567890123z       ->  100z
    ///  1.2345678901229999E-20->  12.345678901229999z   ->  12.3z
    ///  1.235567890123E-20    ->  12.35567890123z       ->  12.4z
    ///  9.995567890123E-19    ->  999.5567890123z       ->  1.00a
    ///  1.2345678901229999E-19->  123.45678901229999z   ->  123z
    ///  1.235567890123E-19    ->  123.5567890123z       ->  124z
    ///  9.995567890123002E-18 ->  9.995567890123002a    ->  10.0a
    ///  1.234567890123E-18    ->  1.234567890123a       ->  1.23a
    ///  1.2355678901230002E-18->  1.2355678901230002a   ->  1.24a
    ///  9.995567890123001E-17 ->  99.95567890123001a    ->  100a
    ///  1.234567890123E-17    ->  12.34567890123a       ->  12.3a
    ///  1.2355678901230001E-17->  12.355678901230001a   ->  12.4a
    ///  9.995567890123E-16    ->  999.5567890123a       ->  1.00f
    ///  1.234567890123E-16    ->  123.4567890123a       ->  123a
    ///  1.2355678901230001E-16->  123.55678901230001a   ->  124a
    ///  9.995567890123002E-15 ->  9.995567890123002f    ->  10.0f
    ///  1.234567890123E-15    ->  1.234567890123f       ->  1.23f
    ///  1.2355678901230002E-15->  1.2355678901230002f   ->  1.24f
    ///  9.995567890123001E-14 ->  99.95567890123001f    ->  100f
    ///  1.2345678901229999E-14->  12.345678901229999f   ->  12.3f
    ///  1.235567890123E-14    ->  12.35567890123f       ->  12.4f
    ///  9.995567890123E-13    ->  999.5567890123f       ->  1.00p
    ///  1.234567890123E-13    ->  123.4567890123f       ->  123f
    ///  1.2355678901230002E-13->  123.55678901230002f   ->  124f
    ///  9.995567890123E-12    ->  9.995567890123p       ->  10.0p
    ///  1.2345678901229999E-12->  1.2345678901229999p   ->  1.23p
    ///  1.235567890123E-12    ->  1.235567890123p       ->  1.24p
    ///  9.995567890123E-11    ->  99.95567890123p       ->  100p
    ///  1.2345678901229998E-11->  12.345678901229998p   ->  12.3p
    ///  1.235567890123E-11    ->  12.35567890123p       ->  12.4p
    ///  9.995567890123E-10    ->  999.5567890123p       ->  1.00n
    ///  1.234567890123E-10    ->  123.4567890123p       ->  123p
    ///  1.235567890123E-10    ->  123.5567890123p       ->  124p
    ///  9.995567890123E-09    ->  9.995567890123n       ->  10.0n
    ///  1.234567890123E-09    ->  1.234567890123n       ->  1.23n
    ///  1.2355678901230001E-09->  1.2355678901230001n   ->  1.24n
    ///  9.995567890123E-08    ->  99.95567890123n       ->  100n
    ///  1.234567890123E-08    ->  12.34567890123n       ->  12.3n
    ///  1.2355678901230001E-08->  12.355678901230001n   ->  12.4n
    ///  9.995567890123E-07    ->  999.5567890123n       ->  1.00µ
    ///  1.234567890123E-07    ->  123.4567890123n       ->  123n
    ///  1.235567890123E-07    ->  123.5567890123n       ->  124n
    ///  9.995567890123E-06    ->  9.995567890123µ       ->  10.0µ
    ///  1.234567890123E-06    ->  1.234567890123µ       ->  1.23µ
    ///  1.235567890123E-06    ->  1.235567890123µ       ->  1.24µ
    ///  9.995567890123001E-05 ->  99.95567890123001µ    ->  100µ
    ///  1.234567890123E-05    ->  12.34567890123µ       ->  12.3µ
    ///  1.2355678901230002E-05->  12.355678901230002µ   ->  12.4µ
    ///  0.0009995567890123001 ->  999.5567890123001µ    ->  1.00m
    ///  0.0001234567890123    ->  123.4567890123µ       ->  123µ
    ///  0.0001235567890123    ->  123.5567890123µ       ->  124µ
    ///  0.009995567890123     ->  9.995567890123m       ->  10.0m
    ///  0.001234567890123     ->  1.234567890123m       ->  1.23m
    ///  0.0012355678901230002 ->  1.2355678901230002m   ->  1.24m
    ///  0.09995567890123001   ->  99.95567890123001m    ->  100m
    ///  0.01234567890123      ->  12.34567890123m       ->  12.3m
    ///  0.01235567890123      ->  12.35567890123m       ->  12.4m
    ///  0.9995567890123       ->  999.5567890123m       ->  1.00
    ///  0.1234567890123       ->  123.4567890123m       ->  123m
    ///  0.12355678901230001   ->  123.55678901230001m   ->  124m
    ///  9.995567890123        ->  9.995567890123        ->  10.0
    ///  1.234567890123        ->  1.234567890123        ->  1.23
    ///  1.235567890123        ->  1.235567890123        ->  1.24
    ///  99.95567890123        ->  99.95567890123        ->  100
    ///  12.345678901229999    ->  12.345678901229999    ->  12.3
    ///  12.35567890123        ->  12.35567890123        ->  12.4
    ///  999.5567890123001     ->  999.5567890123001     ->  1.00k
    ///  123.45678901229999    ->  123.45678901229999    ->  123
    ///  123.5567890123        ->  123.5567890123        ->  124
    ///  9995.567890123        ->  9.995567890123k       ->  10.0k
    ///  1234.5678901229999    ->  1.2345678901229999k   ->  1.23k
    ///  1235.567890123        ->  1.235567890123k       ->  1.24k
    ///  99955.67890123        ->  99.95567890123k       ->  100k
    ///  12345.67890123        ->  12.34567890123k       ->  12.3k
    ///  12355.678901230001    ->  12.355678901230001k   ->  12.4k
    ///  999556.7890123001     ->  999.5567890123001k    ->  1.00M
    ///  123456.7890123        ->  123.4567890123k       ->  123k
    ///  123556.78901230001    ->  123.55678901230001k   ->  124k
    ///  9995567.890123        ->  9.995567890123M       ->  10.0M
    ///  1234567.890123        ->  1.234567890123M       ->  1.23M
    ///  1235567.8901230001    ->  1.2355678901230001M   ->  1.24M
    ///  99955678.90123        ->  99.95567890123M       ->  100M
    ///  12345678.90123        ->  12.34567890123M       ->  12.3M
    ///  12355678.90123        ->  12.35567890123M       ->  12.4M
    ///  999556789.0123        ->  999.5567890123M       ->  1.00G
    ///  123456789.0123        ->  123.4567890123M       ->  123M
    ///  123556789.0123        ->  123.5567890123M       ->  124M
    ///  9995567890.123001     ->  9.995567890123001G    ->  10.0G
    ///  1234567890.123        ->  1.234567890123G       ->  1.23G
    ///  1235567890.1230001    ->  1.2355678901230001G   ->  1.24G
    ///  99955678901.23001     ->  99.95567890123001G    ->  100G
    ///  12345678901.23        ->  12.34567890123G       ->  12.3G
    ///  12355678901.230001    ->  12.355678901230001G   ->  12.4G
    ///  999556789012.3        ->  999.5567890123G       ->  1.00T
    ///  123456789012.29999    ->  123.45678901229999G   ->  123G
    ///  123556789012.3        ->  123.5567890123G       ->  124G
    ///  9995567890123         ->  9.995567890123T       ->  10.0T
    ///  1234567890123         ->  1.234567890123T       ->  1.23T
    ///  1235567890123         ->  1.235567890123T       ->  1.24T
    ///  99955678901230        ->  99.95567890123T       ->  100T
    ///  12345678901230        ->  12.34567890123T       ->  12.3T
    ///  12355678901230        ->  12.35567890123T       ->  12.4T
    ///  999556789012300       ->  999.5567890123T       ->  1.00P
    ///  123456789012300       ->  123.4567890123T       ->  123T
    ///  123556789012300       ->  123.5567890123T       ->  124T
    ///  9995567890123000      ->  9.995567890123P       ->  10.0P
    ///  1234567890123000      ->  1.234567890123P       ->  1.23P
    ///  1235567890123000      ->  1.235567890123P       ->  1.24P
    ///  99955678901230000     ->  99.95567890123P       ->  100P
    ///  12345678901230000     ->  12.34567890123P       ->  12.3P
    ///  12355678901230000     ->  12.35567890123P       ->  12.4P
    ///  9.995567890123E+17    ->  999.5567890123P       ->  1.00E
    ///  1.234567890123E+17    ->  123.4567890123P       ->  123P
    ///  1.235567890123E+17    ->  123.5567890123P       ->  124P
    ///  9.995567890123E+18    ->  9.995567890123E       ->  10.0E
    ///  1.234567890123E+18    ->  1.234567890123E       ->  1.23E
    ///  1.235567890123E+18    ->  1.235567890123E       ->  1.24E
    ///  9.995567890123001E+19 ->  99.95567890123001E    ->  100E
    ///  1.234567890123E+19    ->  12.34567890123E
    
    0 讨论(0)
  • 2020-12-03 18:27

    ICustomFormmatter using a private dictionary for the symbols.

    class EngNotationFormatter : IFormatProvider, ICustomFormatter
    {
        private readonly Dictionary<double, string> notationSymbols = new Dictionary<double, string>
        {
            {double.NegativeInfinity, ""}, //Handles when value is 0
            {-24, "y"},
            {-21, "z"},
            {-18, "a"},
            {-15, "f"},
            {-12, "p"},
            {-9, "n"},
            {-6, "μ"},
            {-3, "m"},
            {0, ""},
            {3, "k"},
            {6, "M"},
            {9, "G"},
            {12, "T"},
            {15, "P"},
            {18, "E"},
            {21, "Z"},
            {24, "Y"},
        };
    
        public string Format(string format, object arg, IFormatProvider formatProvider)
        {
            double value = Convert.ToDouble(arg);
            double engExponent = Math.Floor(Math.Log10(value) / 3) * 3;
    
            return (value * Math.Pow(10, (int)-engExponent)) + notationSymbols[engExponent];
        }
    
        public object GetFormat(Type formatType)
        {
            if (formatType == typeof(ICustomFormatter))
                return this;
            else
                return null;
        }
    }
    

    Example use

    (0.00005678).ToString(new EngNotationFormatter()); //56.78μ
    (0.1234).ToString(new EngNotationFormatter());     //123.4m
    (0).ToString(new EngNotationFormatter());          //0
    (1300).ToString(new EngNotationFormatter());       //1.3k
    (19000).ToString(new EngNotationFormatter());      //19k
    
    0 讨论(0)
  • 2020-12-03 18:33

    Here's a link to some Ruby code that does something similar, though it formats as ffffdem, where m, the exponent, is always a multiple of 3.

    Transliteration to C#. Since I'm not familiar with the format I'm not sure this does exactly what you want. For example, 0.0015 formats as 2e-3. It would be reasonably trivial to substitute the Greek letters for the exponent using a case statement and UTF-8 or other encodings. The exercise is left to the reader.

    public static class FormatExtensions
    {
        public static string ToEngineering( this double value )
        {
            int exp = (int)(Math.Floor( Math.Log10( value ) / 3.0 ) * 3.0);
            double newValue = value * Math.Pow(10.0,-exp);
            if (newValue >= 1000.0) {
                newValue = newValue / 1000.0;
                exp = exp + 3;
            }
            return string.Format( "{0:##0}e{1}", newValue, exp);        
        }
    }
    

    Usage:

    Console.WriteLine( ((double)15000).ToEngineering() );
    double val = 15000;
    Console.WriteLine( val.ToEngineering() );
    
    0 讨论(0)
提交回复
热议问题