2010-08-04 428 views
7

我正在研究C#應用程序。我想用逗號(,)更改小數點數字,其中我使用正則表達式使用點(。)。使用RegEx替換點(。)和逗號(,)?

例如:

Price= 100,00.56 

作爲代表的數值,但我瑞典的這個國際規則,他們有像

Price= 100.00,56 

對數字不同的方式所以我想改變點到逗號(,) (,)和逗號(,)轉換爲使用RegEx的點(。)。可以指導我這一點。

回答

23

格式化數字,你應該使用需要CultureInfo對象string format overload。 swedish的文化名稱是「sv-SE」,可以看到here

decimal value = -16325.62m; 
Console.WriteLine(value.ToString(CultureInfo.CreateSpecificCulture("sv-SE"))); 

編輯

由於@OregonGhost指出 - 解析出號碼也應CultureInfo完成。

+0

虛擬+1,可悲的是我今天沒票了。但知道你贏了它。 :) – sarnold 2010-08-04 09:50:19

+0

偉大的思想..對齊+1 :-) – 2010-08-04 09:50:33

+3

爲標準的解決方案。需要注意的是,這不僅是* formatting *的解決方案,而且還*用於解析*數字。 – OregonGhost 2010-08-04 10:00:45

4

即使沒有正則表達式,你也可以做到這一點。例如

var temp = price.Replace(".", "<TEMP>"); 
var temp2 = temp.Replace(",", "."); 
var replaced = temp2.Replace("<TEMP>", ","); 
4

不確定什麼100,00.56代表,你的意思是10.000,56?
回答你的問題:

對於這樣一個簡單的任務,爲什麼要使用RegEx?你可以這樣做很容易:

string oldValue = "100,00.56"; 
char dummyChar = '&'; //here put a char that you know won't appear in the strings 
var newValue = oldValue.Replace('.', dummyChar) 
         .Replace(',', '.') 
         .Replace(dummyChar, ','); 

編輯 我同意@Oded,用來格式化數字使用CultureInfo類。

+0

'100,00.56'是一個英文表達,'10。000,56' - Sweden/Russian/etc – abatishchev 2010-08-04 10:05:20

+1

@abati:我想他是在談論OP的例子在千位分隔符和小數點分隔符之間只有兩位數的事實。這可能只是一個錯字。 – 2010-08-04 12:14:28

+0

@Alan:你說得對,沒有馬上提及 – abatishchev 2010-08-04 12:26:04

5

也看看

System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator 
3

不要依賴於正則表達式爲這種事情:)使用的構建在文化FX:

decimal s = decimal.Parse("10,000.56", NumberStyles.Currency, CultureInfo.GetCultureInfo("en-US")); 
string output = s.ToString("N",CultureInfo.GetCultureInfo("da-DK")); 

的en-US將正確分析和da-DK使用另一種表示法。我住在DK,因此使用它,但你應該使用適合你的輸出的文化。

4

不是一個正則表達式的解決方案,但是從我的經驗 - 更正確的:

public static string CheckDecimalDigitsDelimiter(this string instance) 
{ 
    var sv = new CultureInfo("sv-SE"); 
    var en = new CultureInfo("en-US"); 

    decimal d; 
    return (!Decimal.TryParse(instance, NumberStyles.Currency, sv, out d) && 
      Decimal.TryParse(instance, NumberStyles.Currency, en, out d)) ? 
     d.ToString(sv) : // didn't passed by SV but did by EN 
     instance; 
} 

這是什麼方法呢?它確保如果給定的字符串是不正確的瑞典字符串,但是正確的英文 - 將其轉換爲瑞典,例如, 100,00 -> 100,00但是100.00 -> 100,00