using System.Collections.Generic;
using System.Globalization;
private static readonly char[] validNumericalValues = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '.' };
public static List<double> ExtractNumbers(string input)
var numbers = new List<double>();
var currentNumber = new StringBuilder();
bool isInsideNumber = false;
foreach (var character in input)
if (IsValidNumericalValue(character))
currentNumber.Append(character);
AddNumberToList(currentNumber.ToString(), numbers);
if (currentNumber.Length > 0)
AddNumberToList(currentNumber.ToString(), numbers);
private static bool IsValidNumericalValue(char character) => Array.IndexOf(validNumericalValues, character) != -1;
private static void AddNumberToList(string numberString, ICollection<double> numbers)
if (double.TryParse(numberString, NumberStyles.Any, CultureInfo.InvariantCulture, out double number))
string inputString = "The price is $42.75 for two items and $18.50 for one item.";
var extractedNumbers = ExtractNumbers(inputString);
Console.WriteLine("Extracted Numbers:");
foreach (var number in extractedNumbers)
Console.WriteLine(number);