2012-01-21 95 views
0

我有字符串「H20」(水的化學分子式)。我想改變它,以便字符串中的所有數字都很小(數字2將是字母H旁邊的小索引)。我怎樣才能做到這一點?C#將字符串更改爲字符串中的小索引

+1

是你的工作是什麼樣的應用 - ASP.NET,WinForms的,WPF,Silverlight中的Windows Phone, XBox 360,Zune,Windows 8 Metro風格,...?你在哪裏/如何顯示這些字符串? C#是一種編程語言。不是演示,這是你想在這裏實現的,所以你的問題沒有正確標記。 –

+0

這是一個桌面應用程序只是爲了獲取數據。無所謂我在那裏顯示數據。然後我將這些數據發送到PHP服務器,然後發送到Android手機。 – Ales

+3

桌面應用程序,你的意思是WinForms或WPF?當然,這很重要你如何顯示數據。這就是你現在的問題:正確顯示數據。 –

回答

4

假設你有顯示標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(); 
} 
+2

IsDigit不僅返回0到9,而且還返回許多其他數字,因此您的警告方法在此處是必需的。這包括全角數字和來自其他文化的數字。 – CodesInChaos

+0

@CodeInChaos:我已經這麼想過了。感謝您的澄清。 – Nuffin

+0

'³'不會與'(c> ='0'&& c <='9')'匹配。 IsDigit可能會做得更好。 –

3

正如在評論中已經指出的那樣,你通常應該使用一些演示這種格式化技術。

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

然而,對於Unicode的,你可以利用的十六進制字符分配superscripts and subscripts block:例如,在HTML中,您可以通過顯示文本。由於統一在.NET原生支持,其中包括字符串常量內,您可以直接使用您所需的字符:

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

注意:使用Unicode標字符將保證您的H₂O字符串將在任何Unicode正確地呈現意識到應用程序,無論其格式化技術(HTML,RTF,PDF,XPS等)。

下面是一個屏幕截圖,顯示了字符串在Windows窗體下如何呈現TextBox。爲了提高可讀性,字體已更改爲11.25pt的Cambria。

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