【问题标题】:C# change numbers to small indexes in stringC# 将数字更改为字符串中的小索引
【发布时间】:2012-02-15 22:20:50
【问题描述】:

我有字符串“H20”(水的化学式)。我想更改它,使字符串中的所有数字都很小(数字 2 将是字母 H 旁边的小索引)。我该怎么做?

【问题讨论】:

  • 您正在开发什么样的应用程序 - ASP.NET、WinForms、WPF、Silverlight、Windows Phone、XBox 360、Zune、Windows 8 Metro 风格……?你在哪里/如何显示这些字符串? C# 是一种编程语言。不是您在此处尝试实现的演示文稿,因此您的问题未正确标记。
  • 这是一个桌面应用程序,只是为了获取数据。我如何在那里显示数据并不重要。然后我将这些数据发送到 PHP 服务器,然后发送到重要的 android 手机。
  • 桌面应用程序是指 WinForms 还是 WPF?当然,如何显示数据也很重要。这就是你现在的问题:正确显示数据。
  • WinForm。所以这只是显示的问题吗?我将如何在 WinForm 中显示它们而不是?
  • 使用 rtf、html 或任何其他控件?

标签: c# .net winforms subscript


【解决方案1】:

假设您有显示下标 unicode 字符的方法,您可以轻松编写自己的下标扩展方法:

public static string Subscript(this string normal)
{
    if(normal == null) return normal;

    var res = new StringBuilder();
    foreach(var c in normal)
    {
        char c1 = c;

        // I'm not quite sure if char.IsDigit(c) returns true for, for example, '³',
        // so I'm using the safe approach here
        if (c >= '0' && c <= '9')
        {
            // 0x208x is the unicode offset of the subscripted number characters
            c1 = (char)(c - '0' + 0x2080);
        }
        res.Append(c1);
    }

    return res.ToString();
}

【讨论】:

  • IsDigit 返回 true 不仅适用于 0-9,还适用于许多其他数字,因此您需要谨慎处理。这包括全角数字和来自其他文化的数字。
  • @CodeInChaos:我已经这么认为了。感谢您的澄清。
  • '³' 也不会匹配 (c &gt;= '0' &amp;&amp; c &lt;= '9')。 IsDigit 可能会做得更好。
  • @HenkHolterman:我明确希望在结果中包含'³'。如果有明确的非 ascii 数字,我想按预期使用它们并保持原样。
  • 您也可以只使用正则表达式替换,这样代码会少得多。
【解决方案2】:

正如 cmets 中所指出的,您通常应该使用一些表示技术来进行这种格式化。例如,在 HTML 中,您可以通过以下方式显示文本:

<span>H<sub>2</sub>O</span>

但是,Unicode 为您可以利用的十六进制字符分配一个superscripts and subscripts block。由于 .NET 原生支持 Unicode,包括在字符串文字中,您可以直接使用所需的字符:

text = text.Replace("H2O", "H₂O");

注意:使用 Unicode 下标字符将保证您的 H₂O 字符串可以在任何支持 Unicode 的应用程序中正确呈现,无论其格式技术(HTML、RTF、PDF、XPS 等)如何)。

下面的屏幕截图显示了字符串如何在 Windows 窗体下的 TextBox 中呈现。为了提高可读性,字体已更改为 Cambria, 11.25pt。

编辑:如果您想将所有数字(不仅仅是2 转换为),您可以使用@Tobias 的代码。这是它的正则表达式改编。因为我假设所有要下标的数字都必须以字母开头,所以我已经包含了一个lookbehind。

text = Regex.Replace(text, @"(?<=[A-Za-z])\d", 
    match => ((char)(match.Value[0] - '0' + '₀')).ToString());

上面会像这样转换一个字符串

CF3CH2Cl + Br2 → CF3CHBrCl + HBr

进入

CF₃CH₂Cl + Br₂ → CF₃CHBrCl + HBr

【讨论】:

    猜你喜欢
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多