如何用上标中的幂来格式化科学记数法中的数字

时间:2018-01-02 12:04:02

标签: c# winforms visual-studio number-formatting

我需要写出如下值:

 images[i].onload = function () {           
     context.drawImage(images[i], u, 0, itemWidth, itemHeight);
 }

我需要知道是否有一种方法可以在字符串中格式化数字。

3 个答案:

答案 0 :(得分:12)

您必须从您正在使用的代码页中找到合适的字符,例如UTF-8

string superScript2 = "²";

字符串中没有格式化,只是所有数据。

答案 1 :(得分:11)

试试这个:

Obj

作为测试用例运行

    public static string Eng(this double x, string format="g")
    {
        const string sup_signs = "⁺⁻⁼⁽⁾ⁿ";
        const string sup_digits = "⁰¹²³⁴⁵⁶⁷⁸⁹";

        if(double.IsNaN(x) || double.IsInfinity(x))
        {
            return x.ToString();
        }

        int num_sign = Math.Sign(x);
        x = Math.Abs(x);
        // group exponents in multiples of 3 (thousands)
        int exp = (int)Math.Floor(Math.Log(x, 10)/3)*3;
        // otherwise use:
        // int exp = (int)Math.Floor(Math.Log(x, 10));
        // and handle the exp==1 case separetly to avoid 10¹
        x*= Math.Pow(10, -exp);
        int exp_sign = Math.Sign(exp);
        exp = Math.Abs(exp);
        // Build the exponent string 'dig' from right to left
        string dig = string.Empty;
        while(exp>0)
        {
            int n = exp%10;
            dig = sup_digits[n] + dig;
            exp = exp/10;
        }
        // if has exponent and its negative prepend the superscript minus sign
        if(dig.Length>0 && exp_sign<0)
        {
            dig = sup_signs[1] + dig;
        }
        // prepend answer with minus if number is negative
        string sig = num_sign<0 ? "-" : "";            
        if(dig.Length>0)
        {
            // has exponent
            return $"{sig}{x.ToString(format)}×10{dig}";
        }
        else
        {
            // no exponent
            return $"{sig}{x.ToString(format)}";
        }
    }

输出:

static void Main(string[] args)
{
    // Type code here.
    double x = Math.PI/50e5;
    for(int i = 0; i < 20; i++)
    {
        // Format output to 12 wide column, right aligned
        Debug.WriteLine($"{ Eng(x, "g4"),12}");
        x*=50;
    }
}

绝不优化,但它确实起作用。指数是工程形式(仅为3的倍数,以避免像 628.3×10⁻⁹ 31.42×10⁻⁶ 1.571×10⁻³ 78.54×10⁻³ 3.927 196.3 9.817×10³ 490.9×10³ 24.54×10⁶ 1.227×10⁹ 61.36×10⁹ 3.068×10¹² 153.4×10¹² 7.67×10¹⁵ 383.5×10¹⁵ 19.17×10¹⁸ 958.7×10¹⁸ 47.94×10²¹ 2.397×10²⁴ 119.8×10²⁴ 这样的事情)。作为奖励,通过分别为4位或5位数提供类似10¹g4的格式代码,可以将数字格式化为特定的有效位数。

  • 它可以处理负数或正数
  • 它可以处理10个
  • 的负指数或正指数
  • 可以格式化尾数
  • 它可以处理g5NAN
  • 它是可重用性的扩展形式

答案 2 :(得分:2)

作为上述评论的后续内容 - 这样的事情可以满足您的需求:

public String FormatAs10Power(decimal val)
{
  string SuperscriptDigits = "\u2070\u00b9\u00b2\u00b3\u2074\u2075\u2076\u2077\u2078\u2079";
  string expstr = String.Format("{0:0.#E0}", val);

  var numparts = expstr.Split('E');
  char[] powerchars = numparts[1].ToArray();
  for (int i = 0; i < powerchars.Length; i++)
  {
    powerchars[i] = (powerchars[i] == '-') ? '\u207b' : SuperscriptDigits[powerchars[i] - '0'];
  }
  numparts[1] = new String(powerchars);
  return String.Join(" x 10",numparts);
}

请参阅:https://dotnetfiddle.net/dX7LAF

根据我上面的评论 - 首先将数字转换为指数格式字符串(https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings#EFormatString),然后将该字符串拆分为指数分隔符&#39; E&#39;。第一个数组是数字部分,第二个是10的幂,它被引用 - 这是使用我给出的链接技术之一(Convert a string/integer to superscript in C#)转换为上标字符,转换回字符串和放大器;两个部分结合使用&#34; x 10&#34;作为新的分隔符。

我假设您希望根据您的示例将值设置为单位数精度,而不使用前面的+符号。如果您还需要其他任何内容,可以将格式作为参数传递。上标+的代码是&#39; \ u207A&#39;。这里有一个链接(在撰写本文时),给出了上标代码列表:http://unicode.org/charts/PDF/U2070.pdf