C # изменить номера на маленькие индексы в строке - PullRequest
0 голосов
/ 22 января 2012

У меня есть строка "H20" (химическая формула для воды). Я хотел бы изменить это так, чтобы все числа в строке были маленькими (число 2 было бы маленьким индексом рядом с буквой H). Как я могу это сделать?

Ответы [ 2 ]

4 голосов
/ 22 января 2012

Как указывалось в комментариях, вы обычно должны использовать некоторые технологии презентации для этого вида форматирования. Например, в HTML вы можете отобразить ваш текст через:

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

Однако Unicode выделяет блок верхних и нижних индексов для шестнадцатеричных символов, которыми вы можете воспользоваться. Поскольку Unicode поддерживается в .NET, в том числе внутри строковых литералов, вы можете напрямую использовать желаемый символ:

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

Примечание : Использование индекса Unicode гарантирует, что ваша строка H₂O будет корректно отображаться в любом приложении с поддержкой Unicode, независимо от технологии форматирования (HTML, RTF, PDF, XPS и т. Д.) .

Ниже приведен скриншот, показывающий, как строка отображается в TextBox в Windows Forms. Чтобы улучшить удобочитаемость, шрифт был изменен на Cambria, 11.25pt.

H₂O as rendered in a TextBox under Windows Forms

Редактировать : Если вы хотите преобразовать все цифры (не только 2 в ), вы можете использовать код @ Tobias. Вот адаптация этого выражения. Я включил вид сзади, так как я предполагаю, что всем цифрам, которые будут подписаны, должна предшествовать буква.

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
4 голосов
/ 22 января 2012

Предполагая, что у вас есть средства для отображения нижних символов Юникода, вы можете легко написать свой собственный метод расширения для подписки:

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();
}
...