开发者

Regex for price

(\d+(?:\.\d+)?)\D*$ - this regex extracts price from any string with decimal point, but I want to extract decimal point only when there is something but not zero like when there is 300.50 or 300.25 then decimal point should be extracted but if there is 300.00 then the decimal point should not be extracted, what to do ?

This is ok, or any better solution is there ?

开发者_开发技巧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", "");
}


I would also investigate using Double.Parse with the right culture info - this is usally a lot simpler and more stable than using your own regular expression.


Assuming by better way you mean "can a regex do this on its own?" then:

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

will place matches in the first regex grouping. What this regex is doing is matching any number and then for the "cents" portion allowing any combination of numbers except 00. Note also that this matches values with two digits in the "cents" portion.

Note that this regex uses [0-9] instead of \d to make it a little clearer which digits are acceptable.

Edit: Please note this regex was tested in GNU/Emacs and not C#, but I don't think there is any difference in this case.

Edit: I made a small mistake where the regex matched '300.' not '300', adjusted regex only groups the period if there is a match.


This regex should work for the inputs you have mentioned. Please see output below.

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

Works as follows

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


For all price format

  • 1,234.56 -- United States
  • 1.234,56 -- German
  • 1'234.56 -- Switzerland
  • 1 234,56 -- French
  • 1,234/56 -- Persian (Iran)
  • 1 234-56 -- Kazakhstan
  • 1 234.56 -- Estonia

and concatenate with other string

  • 1 234.56Adfsafdasfasdf
  • 1 234-56fasdfsadf
  • 1.234,56asdfdasfdsaf

  • and all formats

Regex

@"((?<=\s)|^)[-+]?((\d{1,3}([,\s.']\d{3})*)|\d+)([.,/-]\d+)?((?=\s)|$)"
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜