2015-08-21 79 views
-1

我有這樣分割字符串在C#中的數字和字母

12,3 m一個字符串,我需要2個串一個十進制值和一個單位像12,3m

12.3將返回12.3m

123,4 c將返回123,4c

小數點分隔符可以。或者,

那麼我該如何在C#中,而無需通過每個字符迭代像下面

char c; 

for (int i = 0; i < Word.Length; i++) 
{ 
    c = Word[i]; 

    if (Char.IsDigit(c)) 
    string1 += c; 
    else 
    string2 += c; 
} 

是不是真的需要字符串輸入這樣就可以像A12,3米或ABC3進行格式化。 45或4.5 DEF等,所以字符串分割並不穩定總是

+0

你試過Regex.Split()來分割你的值基於或。或空格,具體取決於你希望如何拆分 – Megha

+0

你是在分割小數字符還是數字和字母字符之間的空格? – user1666620

+0

是的,可以做一個拆分和應用Regx,但尋找單線解決方案 –

回答

4

貌似你試圖基於空白字符分割:

input = "12.3 c"; 
string[] stringArray = string.Split(input, ' '); 

然後,您可以做一個0123對數組的第一個元素執行操作。 float.Parse使用的小數點分隔符取決於您的文化,如果選擇了錯誤的分隔符,您可以獲得FormatException

您也可以通過下面的編程選擇小數點分隔符:

culture.NumberFormat.NumberDecimalSeparator = "."; // or "," 
+0

字符串輸入並非真的需要像這樣格式化,它可以像A12,3 m或ABC3.45或4.5 DEF等等。所以字符串Split總是不穩定 –

+3

@JibinMathew然後把這些信息放在你的問題中,因爲它完全改變了問題和解決方案。你只想要數字嗎? – user1666620

+0

問題編輯 –

0

檢查您提供的例子{ "12,3 m", "A12,3 m", "ABC3.45", "4.5 DEF"}似乎字符串的位置,不僅可以改變,但可以有2串並在inputstrings一個小數。

該解決方案將向您展示如何僅用一個正則表達式提取這些數據,而無需手動分割字符串。我會從user1666620納入的CultureInfo:

string[] inputStrings = new string[] { "12,3 m", "A12,3 m", "ABC3.45", "4.5 DEF"}; 
Regex splitterRx = new Regex("([a-zA-Z]*)\\s*([\\d\\.,]+)\\s*([a-zA-Z]*)"); 
List<Tuple<string, decimal, string>> results = new List<Tuple<string, decimal, string>>(); 
foreach (var str in inputStrings) 
{ 
    var splitterM = splitterRx.Match(str); 
    if (splitterM.Success) 
    { 
     results.Add(new Tuple<string, decimal, string>(
      splitterM.Groups[1].Value, 
      decimal.Parse(
       splitterM.Groups[2].Value.Replace(".", System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator).Replace(
        ",", System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator) 
      ), 
      splitterM.Groups[3].Value 
     )); 
    } 
} 

這會找個禮物/不存在字符串的所有可能的組合,前/後位置,所以一定要檢查各個琴絃或適用的任何組合LOGIK交給他們。

此外,它不僅檢查小數點和字符串之間是否存在單個空格,而且還檢查是否存在任意數量的空格。如果你想限制它只有0或1空格,而不是替換正則表達式:

Regex splitterRx = new Regex("([a-zA-Z]*)[ ]{0,1}([\\d\\.,]+)[ ]{0,1}([a-zA-Z]*)");