2016-11-21 79 views
1
private const string NUMERIC_REGEX = "\\W*([0-9]+)(\\W)?([0-9]*)\\W*" 

我發現這個正則表達式正在我正在使用的項目中使用。假設從包含貨幣的字符串解析數字。你能推薦一個更好的替代這個正則表達式嗎?

像 「14.22€」=> 14.22

但它似乎並不支持這一點。有人可以幫我調整它以適應特殊的貨幣符號嗎?

作爲替代方案,我發現([\d,.]+)可以正常工作,但我不確定是否遺漏了任何特殊情況,或者它可能過於通用。

+0

它並不總是採用這種格式,貨幣符號可以左或右,有或沒有空格 –

+0

嘗試[\ p {Sc} * \ s *([0-9] * \。?[0-9 ] +)\ S * \ p {鈧} *'](http://regexstorm.net/tester?p=%5cp%7bSc%7d*%5cs*%28%5b0-9%5d*%5c.% 3f%5b0-9%5d%2b%29%5cs *%5cp%7bSc%7d *&i = Like +%2214.22 +%e2%82%ac%22)其中'\ p {Sc}'符合貨幣符號。將它用作私人常量字符串NUMERIC_REGEX = @「\ p {Sc} * \ s *([0-9] * \。?[0-9] +)\ s * \ p {Sc} *」;' –

回答

2

很好地回答你的問題是使用正則表達式:

(?:\p{Sc} ?)?([\d,.]+)(?: ?\p{Sc})? 

Regex Proof

這個正則表達式只是您使用的正則表達式的擴展版本。 它所做的是在您的號碼之前和之後檢查可選貨幣符號。

匹配貨幣符號的魔力是\ p {Sc},您可以找到here和一個可選空間。

這個正則表達式檢查非捕獲組中的貨幣符號,這意味着捕獲組1將是您的數字。

欲瞭解更多解釋,只需點擊此答案中的正則表達式鏈接。

2

以及我不知道你是否想使用現有的類,但你可能想嘗試System.Data.SqlTypes.SqlMoney ...這將確保你的字符串不僅僅是由一些正則表達式解析這可能會失敗......

使用會是這樣:

SqlMoney money = SqlMoney.Parse("12,03 €"); 
decimal number = money.Value; 
0

也許這樣的事情? :

const string PATTERN = @"^(?'num'\d{0,}[\.|,]{0,1}\d{0,})"; 

online regex

您可以使用此類似:

match = regex.Match(meInput); 
string numStr = match.Groups["num"].Value; 
double num = double.Parse(numStr); 
相關問題