Мне нужно передать сумму в виде строки в консоль, например. «4 + 5» и проанализировать и рассчитать.
Если вы уверены, что ваша строка представляет собой последовательность чисел, разделённых '+'
и, возможно, белые пространства, вы можете сделать что-то вроде этого:
"4 + 5".Split '+' |> Seq.sumBy (int)
Что делать? .Split '+'
отделяет строку символом +
и создает последовательность строк. В этом примере последовательность будет выглядеть как [|"4 "; " 5"|]
. Функция Seq.sumBy
применяет заданную функцию к каждому элементу последовательности и суммирует результат. Мы используем функцию (int)
для преобразования строк в числа.
Учтите, что это решение не провал, если строка содержит либо символ, отличный +
, пробелов и цифр или если строка без знака отделяется +
(например + 7 + 8
или 7 ++ 8
).
Возможно, вы захотите поймать System.FormatException
. Вы бы в конечном итоге с чем-то вроде
let sumString (input:string) : int =
try
input.Split '+' |> Seq.sumBy (int)
with
| :? System.FormatException ->
print "This does not look like a sum. Let's just assume the result is zero."
0
Это будет только выход 0
для любой неверной формулы. Еще один вариант, чтобы избежать исключения, выбрасывает все нежелательные символы и пустые строки:
let sumString (input:System.String) : int =
(input |> String.filter (fun c -> ['0'; '1'; '2'; '3'; '4'; '5'; '6'; '7'; '8'; '9'; '+'] |> List.contains c)).Split '+'
|> Seq.filter (((<) 0) << String.length)
|> Seq.sumBy (int)
Что делает этот код? String.filter
запрашивает нашу анонимную функцию для каждого символа, следует ли ее учитывать. Наша анонимная функция проверяет, находится ли символ в списке допустимых символов. Результатом является новая строка, содержащая только цифры и +
. Мы разделили эту строку на +
.
Прежде чем передать наш список строк в Seq.sumBy (int)
, мы фильтруем наши пустые строки. Это делается с помощью Seq.filter
и состав функций: (<)
возвращает true
, если первый параметр меньше второго. Мы используем currying для получения (<) 0
, который проверяет, является ли данное целое число больше 0
. Мы составляем эту функцию с String.length
, которая отображает строку в целое число, указывающее ее длину.
После того, как Seq.filter
сыграет с этой функцией, мы передаем полученный список Seq.sumBy (int)
, как указано выше.
Это, однако, может привести к неожиданным результатам для чего угодно, кроме сумм. "4 * 5 + 7"
даст 52
.
См. [Int32.Parse Method (String)] (https://msdn.microsoft.com/en-us/library/b3h1hf19 (v = vs.110) .aspx) –
Интерес: [Калькулятор формул] (http://www.fssnip.net/4Y) –
Я взглянул на метод Int32.Parse, но борюсь с тем, как читать в операторе сумму –