2015-04-10 4 views
0

Я ужасно с шаблонами регулярных выражений. Я пытаюсь проверить ввод (с C#) в виде целого числа (1234), десятичного (1234.50) или дроби (1234 1/2). Я в настоящее время использую эту модельРегулярное выражение для десятичных или десятичных чисел

[^ 0-9.] +

который обрабатывает только целые числа и десятичные дроби. Есть ли способ, который я могу расширить, чтобы обрабатывать фракции?

+0

Вы действительно планируете разбор входных данных на 'int' или' decimal'? Или это хранится/используется как строка? – Kjata30

+0

У меня есть WPF-конвертер, который принимает текст дроби и преобразует его в десятичный для меня. Поэтому, чтобы ответить на ваш вопрос - decimal – Travyguy9

+0

Я добавил ответ, который позволяет избежать Regex, если вы заинтересованы, но предполагает, что вы преобразовываете дробь в десятичный. Я не знаю, зачем нужен конвертер (это простая операция?), Но если вам нужно его использовать, вам, вероятно, лучше использовать Regex. – Kjata30

ответ

3

Вы можете использовать регулярное выражение как это:

^\(\d+(?:\.?\d*|\s\d+\/\d+)\)$ 

Working demo

Если вы не хотите включать в круглые скобки, вы можете использовать

^\d+(?:\.?\d*|\s\d+\/\d+)$ 

Вы можете легко видеть, как десятичные/шаблоны дробей:

Regular expression visualization

+0

Эта диаграмма потрясающая! Вы создали это вручную или есть инструмент, который может это сделать? –

+0

@BJMyers Это инструмент онлайн-regex https://www.debuggex.com/, это очень полезно –

-1

Это должно работать:

\d*(?:\s+\d+/\d+|\.\d+)? 
0

Regex это хорошо, если вы просто хотите проверить строку и сохранить ввод как string. Однако, если вы собираетесь делать какие-либо операции с числовым значением, вам лучше просто попытаться разобрать значение сразу.

string input = "1234 1/2"; 
decimal? inputAsDec = null; 
decimal? fractionAsDec = null; 
var wholeAndFraction = input.Split(' '); 

if (wholeAndFraction.Count == 2 && input.Contains('/')) 
{ 
    var fraction = wholeAndFraction[1].Split('/'); 
    decimal? numerator = null; 
    decimal? denominator = null; 

    if (decimal.TryParse(fraction[0], out numerator) && decimal.TryParse(fraction[1], out denominator)) 
    { 
     fractionAsDec = numerator/denominator; 
    } 
} 

if (decimal.TryParse(wholeAndFraction[0], out inputAsDec)) 
{ 
    if (fractionAsDec != null) 
    { 
     inputAsDec += fractionAsDec; 
    } 
}