2013-12-09 5 views
2

Поскольку я разработчик C#, я бы тоже принял ответы C#.Regex, чтобы получить десятичное значение в строке

Допустим, у меня есть эта строка: «R 560,00»

Существует характер Альфа и пространство с десятичным значением.

Мы также можем иметь котировки на строке.

Но я хочу получить только десятичное значение в строке. Все остальные символы должны быть удалены.

ПРИМЕЧАНИЕ: String.Replace работает не так, как я хочу, поэтому я обращаюсь к Regex.

Это то, что я пробовал: поля (amountIdx) будет содержать R560.00

Dim regex As New Regex("^[0-9]+(\.[0-9]{1,2})?$", RegexOptions.IgnoreCase) 
Dim amount As String = regex.Replace(fields(amountIdx), "^[0-9]+(\.[0-9]{1,2})?$") 

Но сумма отражается обратно в R 560.00. Он не удаляет других символов. Как это сделать?

+0

Как десятичное? Вы принимаете регулярное выражение, которое испускает только десятичные точки и числа? Очевидно, R 56.0.00 пройдет; Вы хотите, чтобы? – Bathsheba

+2

Зачем «Заменить» вместо «Матч»? – Jon

+0

Что сказал Джон и удалил^с начала регулярного выражения (и с конца, если вы не ожидаете, что десятичная цифра будет последней вещью в строке) – Ben

ответ

4

Вы можете просто использовать

Regex.Replace("R500.12", "[^-?\d+\.]", "")) 

Eg: MsgBox(Regex.Replace("R500.12", "[^-?\d+\.]", ""))

Он вернется 500,12

+0

Я специально сказал Regex. Вы видели версию LINQ VB? Это действительно путающие вещи. Я помечаю ваш ответ как правильный, просто измените ваше регулярное выражение на: \ d + \.?\ d * –

+0

Могу ли я узнать, каков ваш ожидаемый ответ? Это «R» или «500.12». Если это «R», тогда \ d + \.? \ D * будет работать, а для «500.12» [^ -? \ D + \.] Это работает. –

1

Попробуйте

var resultArray = Regex.Split(input_string, @"[^0-9\.]+") 
.Where(c => c != "." && c.Trim() != ""); 

Где (с => ...) является лямбда для решения каждого элемента массива и с представляет собой элемент массива

+0

Строка ввода не была в правильном формате. –

+0

Вы заменили свое? –

+0

Да, сумма, поступающая в «input_string», равна: R 560.00 –

1

Вот такой LINQ взламывать взять первый десятичный у положительное число в строке, где «десятичный у» определяется последовательностью цифр и точек:

string s = "R 560.00"; 
string decimalyNumber = new String(s.SkipWhile(c => !Char.IsDigit(c) || c != '.') 
    .TakeWhile(c => Char.IsDigit(c) || c == '.').ToArray()); 

он работает, пропуская через символы до тех пор, пока не найдет цифру/точку, а затем принимать все в непрерывная последовательность цифр и точек. Я предположил бы, что производительность будет не так жарко, но если вы не получили миллионы их, чтобы сделать в короткий промежуток времени ...


Или, вы можете использовать Regex и просто соответствовать [0-9]*(?:\.[0-9]+)?, который равен нулю или больше цифр, за которыми следует точка и одна или несколько цифр (не захваченных).

+0

[0-9] * (?: \. [0-9] +)? не работал. но \ d + \.? \ d * делает –

Смежные вопросы