【问题标题】:Convert a string/integer to superscript in C#在 C# 中将字符串/整数转换为上标
【发布时间】:2020-05-26 04:05:09
【问题描述】:

是否有内置的 .NET 函数或简单的转换方法:

"01234"

到:

"\u2070\u00B9\u00B2\u00B3\u2074"

请注意,上标 1、2 和 3 不在\u2070-\u209F 范围内,而是在\u0080-\u00FF 范围内。

【问题讨论】:

    标签: c# unicode


    【解决方案1】:

    编辑:我没有注意到上标字符不像\u2070-\u2079 那样简单。您可能想要设置字符之间的映射。如果你只需要数字,你可以很容易地索引到一个字符串:

    const string SuperscriptDigits = 
        "\u2070\u00b9\u00b2\u00b3\u2074\u2075\u2076\u2077\u2078\u2079";
    

    然后使用 LINQ:

    string superscript = new string(text.Select(x => SuperscriptDigits[x - '0'])
                                        .ToArray());
    

    或者没有:

    char[] chars = text.ToArray();
    for (int i = 0; i < chars.Length; i++)
    {
        chars[i] = SuperscriptDigits[chars[i] - '0'];
    }
    string superscript = new string(chars);
    

    【讨论】:

    • 上标 1-3 的代码点在其他地方:unicode.org/charts/PDF/U2070.pdf
    • 我认为使用 String.Concat() 而不是使用 LINQ 方法的字符串构造函数会更容易。除非两者之间存在显着的性能差异。
    • @Jeff:我不知道这会更容易。
    • @Jon:构造函数重载需要一个字符数组,而Concat() 的通用重载接受IEnumerable&lt;T&gt;,因此不需要ToArray() 调用。无论如何,这就是我的推理。
    • @Jeff:我可以看到Concat&lt;IEnumerable&lt;T&gt;&gt;Concat&lt;IEnumerable&lt;string&gt;&gt; 通话,但看不到Concat&lt;IEnumerable&lt;char&gt;&gt;。我怀疑前者会在每个元素上调用ToString,这会不必要地创建一堆字符串。此外,这些调用仅在 .NET 4 中可用,而我的方法也适用于 .NET 3.5。我想我宁愿坚持使用 ToArray 和构造函数:)
    猜你喜欢
    • 2011-04-21
    • 2021-08-15
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 2019-10-31
    • 2021-11-07
    相关资源
    最近更新 更多