2010-10-28 183 views
1

(\d+(?:\.\d+)?)\D*$ - 此正則表達式中提取價格從帶小數點的任何字符串,但我想提取小數點時,纔會有東西,但不爲零時,有300.50或300.25那麼小數點應被提取,但就像如果有是300.00,那麼不應該提取小數點,該怎麼辦?正則表達式價格

這是確定的,或任何更好的解決方案是存在的?

Match match = Regex.Match(cellRecord, @"(\d+(?:\.\d+)?)\D*$"); 
price = match.Groups[1].Value.ToString().Trim(); 
if (price.Substring(price.Length - 3, 3) == ".00") 
{ 
    price = price.Replace(".00", ""); 
} 
+0

我不知道語法是什麼'(?:\ \ d +)'......如果你能使其更常用的正則表達式,(更「正規」的正則表達式...),也許更多的人知道答案。 – 2010-10-28 05:24:29

+2

將它加載到Decimal(Decimal.Parse(...))並在輸出時決定字符串的格式會更好嗎?解析VS域模型vs演示文稿,還挺。 – sisve 2010-10-28 05:46:30

回答

0

這個正則表達式應該適用於你提到的輸入。請看下面的輸出。

"\b(\d+(?:\.(?:[^0]\d|\d[^0]))?)\b" 

的工作原理如下

input OPTIDX 26FEB2009 NIFTY CE 2800 
output 2800 

input 123.00 
output 123 

input 123.06 
output 123.06 

input 123.50 
output 123.50 
1

通過更好的方式假設你的意思是「可以一個正則表達式做到這一點對自己?」那麼:

([0-9]+(?:\.(?:[1-9][1-9]|[0-9][1-9]|[1-9][0-9]))?)(?=[^0-9]) 

將在第一個正則表達式分組中放置匹配項。這個正則表達式所做的是匹配任何數字,然後是「美分」部分,允許除00之外的任何數字組合。還要注意,這與「美分」部分中的兩位數字匹配。

注意,此正則表達式使用[0-9],而不是\ d,使其更清晰一點,其數字是可以接受的。

編輯:請注意,這個正則表達式在GNU/Emacs中測試,而不是C#,但我認爲這種情況沒有任何區別。

編輯:我犯了一個小錯誤,正則表達式匹配'300'。不是'300',調整後的正則表達式只會在有匹配的情況下對期間進行分組。

+0

+1非常感謝你,它的偉大工程.. – Harikrishna 2010-10-28 11:57:07

+0

它不OPTIDX 26FEB2009 NIFTY工作CE 2800它以日期這裏比賽就像26 – Harikrishna 2010-10-28 12:57:49

+0

@Harikrishna你原來的問題給出了非常具體的輸入條件,這個問題是進入問題的具體細節。例如,如果您知道所有「時間」值後面跟着空格,您可以調整正則表達式的正向超前部分...即[(?= [^ 0-9])'可以更改爲'(?= \ S)'。只有當「時間」後面跟着一個空格,而不是時間後面跟着一個數字時,纔會發生匹配。或者,您可以排除所有與「(?= [^ 0-9a-zA-Z])匹配的字母數字字符''。 – nixeagle 2010-10-28 21:19:50

3

我也將調查使用Double.Parse與正確的文化信息 - 這是usally一定比用自己的正則表達式更簡單,更穩定。