regex to format numbers

Hi
I Need a RegEx (replace) to Format a numeric User Input in the following

Input  "1"   --> Output "0,01"
Input  "11"   --> Output "0,11"
Input  "111"   --> Output "1,11"
Input  "1111"   --> Output "11,11"
Input  "11111"   --> Output "111,11"
Input  "111111"   --> Output "1.111,11"

and so on.

the number "1" is just an example, all numbers should be processed  

Pls no Answers with string.Format(...) or decimal.ToString(...)  or...

I need a Regular Expression !

var regex = new Regex(....);
string result = regex.Replace(userinput, ...);


Thank you
Peter
LVL 1
PeterInStingbertAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

käµfm³d 👽Commented:
What are the lower and upper bounds of your input?
0
käµfm³d 👽Commented:
Also, how are you going to use this? The conditional replacements you have above are going to make a single expression difficult to craft.
0
AndyAinscowFreelance programmer / ConsultantCommented:
Another minor point of clarification.
does
"1.1" (note the decimal point) transform to "0,01.0,01" ?
0
Cloud Class® Course: Microsoft Windows 7 Basic

This introductory course to Windows 7 environment will teach you about working with the Windows operating system. You will learn about basic functions including start menu; the desktop; managing files, folders, and libraries.

PeterInStingbertAuthor Commented:
Upper/Lower Bounds

Lower bound is one Digit

"1" --> "0,01"    

Upper bound are 7 digits

"9999999"  --> "99.999,99"


Condition - yes I know.
"Normal number formatting" with  decimal-point an thousands-separtor is easy.  

Is a regex with "Or-Condition" in input and replace-Condition generally possible?


I use a given module. This module run  
...
var regex = new Regex(....);
return result = regex.Replace(userinput, ...);

midmost.

Peter
0
PeterInStingbertAuthor Commented:
A decimal separator in the Input string has to keep

The decimal separator is "," (Germany) and is entered as ","

Input ",1" --> Output "0,10"
Input " 1,11" --> Output "1,11


thousands-separtor  "." are not in the input-string.

Peter
0
AndyAinscowFreelance programmer / ConsultantCommented:
Hmm.

"1" goes to "0,01" (ie divided by 100) BUT ",1" stays as "0,10" (not divided by 100)
0
PeterInStingbertAuthor Commented:
Yes
"1"  ist one Cent
but
",1" ist 0,1 Euro = 10 Cent

if a decimal Point is entered it is "Euro"
if not it is "Cent" = 1/100 "Euro"
0
käµfm³d 👽Commented:
I don't think this is going to happen in one regex. What are you allowed to pass to this module? Just the regex, or the replacement pattern as well?
0
PeterInStingbertAuthor Commented:
I can pass:

 the regex-Expression = p1
 the regex-Options-Enum = p2
 the replacement-Pattern = p3


...
var regex = new Regex(p1, p2);
return result = regex.Replace(userinput, p3);
...
0
käµfm³d 👽Commented:
I suggest four calls:  Two to add zeroes to short numbers, one for the decimal portion, and one for the thousands separation.

e.g.

Module.DoReplacement(@"^(\d)$", RegexOptions.None, "00$1");
Module.DoReplacement(@"^(\d{2})$", RegexOptions.None, "0$1");
Module.DoReplacement(@"\d{2}$", RegexOptions.None, ",$1");
Module.DoReplacement(@"(?<=\d)(\d{3})(?=[^,]*,\d{2})", RegexOptions.RightToLeft, ".$1")

Open in new window


If you care to check the length of the source string before doing this logic, then you can just do the formatting in the first two calls (above) rather than letting them drop through to the other two calls.
0
PeterInStingbertAuthor Commented:
obviously there i no "universal" RegEx for oll my requirements   - ???

OK

@"^(\d)$", RegexOptions.None, "0,0$1"     is for Input  "1"   --> Output "0,01"


@"^(\d{2})$", RegexOptions.None, "0,$1"    is for Input  "11"   --> Output "0,11"


But what is @"(?<=\d)(\d{3})(?=[^,]*,\d{2})", RegexOptions.RightToLeft, ".$1") for?
I tried this Expression without any result


Peter
0
käµfm³d 👽Commented:
The intent was that you pass the result of each call to the next replacement call. I don't know how your module is structured, and it doesn't appear that module accepts the source string as a parameter, so I pseudo-coded that bit. A bit more pseudo-code:

var result = Module.DoReplacement(source, @"^(\d)$", RegexOptions.None, "00$1");
result = Module.DoReplacement(result, @"^(\d{2})$", RegexOptions.None, "0$1");
result = Module.DoReplacement(result, @"\d{2}$", RegexOptions.None, ",$1");
result = Module.DoReplacement(result, @"(?<=\d)(\d{3})(?=[^,]*,\d{2})", RegexOptions.RightToLeft, ".$1")

return result;

Open in new window


You'll need to adapt the above to fit the environment, but it should at least demonstrate the concept.
0
PeterInStingbertAuthor Commented:
The module does not accept the Input value by Parameter.
The Input-Value "is handled inside" and is generated by Key-Commands.
The regex is just to generate a formatted view.
I know this is "not the best solution", but the modul it is given by 3rd Party
0
käµfm³d 👽Commented:
If you can (effectively) only make one call to the module, then you are not going to be able to accomplish this formatting. If .NET supported conditional replacements for regex, then it could work, but the fact that you have numbers that you need to pad with leading zeroes complicates the issue.
0
AndyAinscowFreelance programmer / ConsultantCommented:
I'd be tempted to make your own class that does some preformatting/checking then calls your module.
eg.  It checks if the numeric string requires a leading zero and prepends one if necessary.  It checks if it requires division be 100 and makes changes as required.  It checks if it will require thousands separators.  After all that you *might* have a string you can pass into your module just the once to obtain what you require.


ps.  All this might be simpler with a .Format or a .ToString call.
0
käµfm³d 👽Commented:
If you do as Andy suggests, and you have your custom class perform the first three lines of what I posted, then you can use only the last line of my suggestion as your call to the module.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Regular Expressions

From novice to tech pro — start learning today.