У меня есть строка с символом валюты. Мне нужно извлечь только десятичную дробь вместе с отрицательным знаком.
Вот несколько примеров строки и желаемого десятичного значения:
-$ 100 : -100
C$ 400.68 : 400.68
-$ 578.89: -578.89
Это код, который я использую в настоящее время.
var match = Regex.Match(valueToParse, @"-?[0-9]*\.?[0-9]+");
if (match.Success)
{
decimal.TryParse(match.Value, out result);
}
Он работает для извлечения десятичных чисел, но не работает для 1-го и 3-го примеров. Любое предложение приветствуется.
Вы можете заменить все, кроме -
, цифр и .
, используя это регулярное выражение с пустой строкой,
[^-\d\n.]+
что оставит вас только с желаемым номером с отрицательным знаком.
Regex regex = new Regex(@"[^-\d\n.]+");
string input = "-$ 100";
string result = regex.Replace(input, "");
Console.WriteLine(input + " --> " + result);
input = "C$ 400.68";
result = regex.Replace(input, "");
Console.WriteLine(input + " --> " + result);
input = "-$ 578.89";
result = regex.Replace(input, "");
Console.WriteLine(input + " --> " + result);
Принты,
-$ 100 --> -100
C$ 400.68 --> 400.68
-$ 578.89 --> -578.89
Для этого можно использовать группы захвата. Один для знака, а другой для суммы. Затем вы можете объединить оба и попытаться проанализировать его как десятичное число.
Регулярное выражение, которое я использую ниже, имеет несколько предположений. Но он должен соответствовать предложенным вами вариантам использования.
var valueToParse = "-$ 578.89";
var match = Regex.Match(valueToParse, @"^(?<sign>-?).*? (?<amount>\d+(\.\d+)?)$");
if (match.Success)
{
decimal.TryParse($"{match.Groups["sign"]}{match.Groups["amount"]}", out var result);
Console.WriteLine(result);
}
Умный, мыслит нестандартно. +1