PeterInStingbert
asked on
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
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
What are the lower and upper bounds of your input?
Also, how are you going to use this? The conditional replacements you have above are going to make a single expression difficult to craft.
Another minor point of clarification.
does
"1.1" (note the decimal point) transform to "0,01.0,01" ?
does
"1.1" (note the decimal point) transform to "0,01.0,01" ?
ASKER
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
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
ASKER
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
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
Hmm.
"1" goes to "0,01" (ie divided by 100) BUT ",1" stays as "0,10" (not divided by 100)
"1" goes to "0,01" (ie divided by 100) BUT ",1" stays as "0,10" (not divided by 100)
ASKER
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"
"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"
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?
ASKER
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);
...
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);
...
I suggest four calls: Two to add zeroes to short numbers, one for the decimal portion, and one for the thousands separation.
e.g.
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.
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")
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.
ASKER
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
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})(?=[^,]*,\
I tried this Expression without any result
Peter
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:
You'll need to adapt the above to fit the environment, but it should at least demonstrate the concept.
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;
You'll need to adapt the above to fit the environment, but it should at least demonstrate the concept.
ASKER
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
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
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.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.