在C#中将字符串/整数转换为上标

14

是否有一个内置的.NET函数或者一个简单的方法可以将以下内容进行转换:

"01234"

发送至:

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

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

1个回答

20

编辑:我没有注意到上标字符不像\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);

我认为使用String.Concat()比使用带有LINQ方法的字符串构造函数更容易。除非两者之间存在显着的性能差异。 - Jeff Mercado
@Jeff:我不明白那会更容易些。 - Jon Skeet
@Jon:构造函数重载需要一个字符数组,而Concat()的通用重载接受IEnumerable<T>,因此不需要进行ToArray()调用。这是我的推理。 - Jeff Mercado
1
@Jeff:我可以看到一个Concat<IEnumerable<T>>和一个Concat<IEnumerable<string>>的调用,但没有Concat<IEnumerable<char>>。我怀疑前者会在每个元素上调用ToString,这将不必要地创建一堆字符串。此外,这些调用仅在.NET 4中可用,而我的方法也适用于.NET 3.5。我想我还是坚持使用ToArray和构造函数 :) - Jon Skeet
@Jon:好的,你说得对。正如你指出的那样,它确实有一点性能差异。我必须记住避免在字符转换时出现这种情况。 - Jeff Mercado
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接