JavaAndCSharp
JavaAndCSharp

Reputation: 1557

Finding all numbers in a string

Part of my app has an area where users enter text into a textBox control. They will be entering both text AND numbers into the textBox. When the user pushes a button, the textBox outputs its text into a string, finds all numbers in the string, multiplies them by 1.14, and spits out the typed text into a pretty little textBlock.

Basically, what I want to do is find all the numbers in a string, multiply them by 1.14, and insert them back into the string.

At first, I thought this may be an easy question: just Bing the title and see what comes up.

But after two pages of now-purple links, I'm starting to think I can't solve this question with my own, very skimpy knowledge of Regex.

However, I did find a hearty collection of helpful links:

Please note: A few of these articles come close to doing what I want to do, by fetching the numbers from the strings, but none of them find all the numbers in the string.

Example: A user enters the following string into the textBox: "Chicken, ice cream, 567, cheese! Also, 140 and 1337."

The program would then spit out this into the textBlock: "Chicken, ice cream, 646.38, cheese! Also, 159.6 and 1524.18."

Upvotes: 4

Views: 1834

Answers (2)

Guffa
Guffa

Reputation: 700322

You can use a regular expression that matches the numbers, and use the Regex.Replace method. I'm not sure what you include in the term "numbers", but this will replace all non-negative integers, like for example 42 and 123456:

str = Regex.Replace(
  str,
  @"\d+",
  m => (Double.Parse(m.Groups[0].Value) * 1.14).ToString()
);

If you need some other definition of "numbers", for example scientific notation, you need a more elaboarete regular expression, but the principle is the same.

Upvotes: 4

sehe
sehe

Reputation: 392954

Freely adopted from the sample here

Beware of your regional options (since you're parsing and serializing floating point numbers)

using System;
using System.Text.RegularExpressions;

class MyClass
{
   static void Main(string[] args)
   {
      var input = "a 1.4 b 10";

      Regex r = new Regex(@"[+-]?\d[\d\.]*"); // can be improved

      Console.WriteLine(input);
      Console.WriteLine(r.Replace(input, new MatchEvaluator(ReplaceCC)));
   }

   public static string ReplaceCC(Match m)
   {
       return (Double.Parse(m.Value) * 1.14).ToString();
   }
}

[mono] ~ @ mono ./t.exe
a 1.4 b 10
a 1.596 b 11.4

Upvotes: 2

Related Questions