Проверка, содержит ли строка float или int - PullRequest
2 голосов
/ 16 марта 2020

Мне нужно написать функцию erlang, которая принимает строку, а затем выполняет разные действия, если строка содержит число с плавающей запятой или целое число. Я думал об использовании string: to_float и string: to_integer, но мне интересно, можно ли использовать их в сопоставлении с образцом для сопоставления различных предложений или нужно ли мне использовать ifs для проверки в одном предложении.

1 Ответ

3 голосов
/ 16 марта 2020

Erlang сопоставление с образцом не является хорошим подходом к решению этой проблемы из-за большого разнообразия представлений чисел, которые должны быть обработаны. Вам лучше попробовать преобразование строки в число , а затем использовать защитные элементы для отделения чисел от чисел с плавающей точкой:

float_or_integer(F) when is_float(F) -> float;
float_or_integer(I) when is_integer(I) -> integer;
float_or_integer(L) ->
    Number = try list_to_float(L)
             catch
                 error:badarg -> list_to_integer(L)
             end,
    float_or_integer(Number).

Заменить тела первых двух функций на logi c определите c к проблеме, которую вы решаете.

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

...