CREATE OR REPLACE FUNCTION "sys"."isnumeric"(text)
RETURNS "pg_catalog"."bool" AS $BODY$
DECLARE x NUMERIC;
BEGIN
x = $1::NUMERIC;
RETURN TRUE;
EXCEPTION WHEN others THEN
RETURN FALSE;
END;
$BODY$
LANGUAGE 'plpgsql' IMMUTABLE STRICT COST 100
;
ALTER FUNCTION "sys"."isnumeric"(text) OWNER TO "postgres";
create or replace function isnumeric(string text) returns bool as $$
begin
perform string::numeric;
return true;
exception
when invalid_text_representation then
return false;
end;
$$ language plpgsql security invoker;
8条答案
按热度按时间x6492ojm1#
我认为最简单的方法是正则表达式匹配:
z18hc3ub2#
我想提出另一个建议,因为
12a345
通过ns16的答案返回true
。oo7oh9g93#
我修正了a_horse_with_no_name建议的正则表达式。
zphenhs44#
我创建了一个函数来检查这个问题,使用了“trycatch”。
函数试图将文本转换为“numeric”。如果转换正确,则返回true,如果转换失败,则返回false。
w8rqjzmb5#
如果你想检查指数,+/-,那么最好的表达式是:
导致:
是真的。
表达式来自:https://www.regular-expressions.info/floatingpoint.html
您可以检查其他类型的数字,例如,如果您希望使用带符号的decimal。
7kqas0il6#
ctrmrzij7#
如果您只需要接受双精度数字,这应该可以正常工作:
这也可以接受整数和负数:
0mkxixxg8#
基于Fernando's answer构建,这稍微短了一点,不需要声明变量,并给出了确切的异常类型(出于教学目的):