如何判断字符串是否为合法数值、浮点、科学计数等格式-阿里云开发者社区

开发者社区> 德哥> 正文

如何判断字符串是否为合法数值、浮点、科学计数等格式

简介:
+关注继续查看

背景

如何判断一个字符串是合法的数值、浮点或者科学计数的格式?

首先想到的是正则表达式。

一些匹配规则如下:

  "^\d+$"                   //非负整数(正整数   +   0)       
  "^[0-9]*[1-9][0-9]*$"     //正整数       
  "^((-\d+)|(0+))$"         //非正整数(负整数   +   0)       
  "^-[0-9]*[1-9][0-9]*$"    //负整数       
  "^-?\d+$"               //整数       
  "^\d+(\.\d+)?$"           //非负浮点数(正浮点数   +   0)       
  "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"     //正浮点数       
  "^((-\d+(\.\d+)?)|(0+(\.0+)?))$"                                                      //非正浮点数(负浮点数   +   0)       
  "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数       
  "^(-?\d+)(\.\d+)?$"       //浮点数  

PostgreSQL支持正则表达,UDF函数,可以完成这项工作。

正文

将正则表达式写成函数即可完成对应的判断,例子

create or replace function check_int(text) returns boolean as $$  
  select $1 ~ '^\d+$';  
$$ language sql strict;  

验证

postgres=# select check_int('1');  
 check_int   
-----------  
 t  
(1 row)  
  
postgres=# select check_int('123');  
 check_int   
-----------  
 t  
(1 row)  
  
postgres=# select check_int('123.1');  
 check_int   
-----------  
 f  
(1 row)  
  
postgres=# select check_int('');  
 check_int   
-----------  
 f  
(1 row)  
  
postgres=# select check_int('abc');  
 check_int   
-----------  
 f  
(1 row)  

如果不区分格式的话,可以使用PostgreSQL的强制转换以及函数来处理,使用异常捕获即可。

postgres=# create or replace function check_numeric(text) returns boolean as $$  
declare  
begin  
  perform ($1)::numeric;  
  return true;  
exception when others then  
  return false;  
end;  
$$ language plpgsql strict;  
CREATE FUNCTION  

验证

postgres=# select check_numeric('12..1');  
 check_numeric   
---------------  
 f  
(1 row)  
  
postgres=# select check_numeric('12.1');  
 check_numeric   
---------------  
 t  
(1 row)  
  
postgres=# select check_numeric('12.1a');  
 check_numeric   
---------------  
 f  
(1 row)  

如果你要强转异常的值,可以自定义cast进行转换,例子.

postgres=# select '12.1a.1'::text::numeric;    
ERROR:  invalid input syntax for type numeric: "12.1a.1"    
    
postgres=# create or replace function text_to_numeric(text) returns numeric as $$    
select to_number($1,'9999999999999999999999999.99999999999999');    
$$ language sql strict;    
CREATE FUNCTION    
postgres=# select text_to_numeric('12.1a.1');    
 text_to_numeric     
-----------------    
           12.11    
(1 row)    
    
postgres=# create cast (text as numeric) with function text_to_numeric(text) ;    
CREATE CAST    
    
postgres=# select '12.1a.1'::text::numeric;    
 numeric     
---------    
   12.11    
(1 row)    

补充

补充 

//正则匹配 

匹配中文字符的正则表达式: [\u4e00-\u9fa5] 

匹配双字节字符(包括汉字在内):[^\x00-\xff] 

匹配空行的正则表达式:\n[\s| ]*\r 

匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 

匹配首尾空格的正则表达式:(^\s*)|(\s*$)(像vbscript那样的trim函数) 

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 

匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)? 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
JS 判断输入字符串的长度(中文占用两个字节,英文占用一个字节)
function getByteLen(val) {    //传入一个字符串            var len = 0;            for (var i = 0; i
522 0
51 Nod 1791 合法括号子段【分治+字符串】
1791 合法括号子段 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 有一个括号序列,现在要计算一下它有多少非空子段是合法括号序列。 合法括号序列的定义是: 1.空序列是合法括号序列。
821 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4623 0
ylb:SQLServer常用系统函数-字符串函数、配置函数、系统统计函数
原文:ylb:SQLServer常用系统函数-字符串函数、配置函数、系统统计函数 ylbtech-SQL Server:SQL Server-SQLServer常用系统函数 -- =============================================-- ylb:SQLSe...
828 0
推荐一个markdown格式转html格式的开源JavaScript库
这个markdown格式转html格式的开源JavaScript库在github上的地址: https://github.com/millerblack/markdown-js 从markdown 格式转成html源代码格式 新建一个以js结尾的文件,将下列内容粘贴进去: var markdown = require( "markdown" ).
1781 0
【POI】使用POI 创建生成XLS,打开xls文件提示【此文件中某些文本格式可能已经更改,因为它已经超出最多允许的字体数。】
 使用POI 创建生成XLS,打开xls文件提示【此文件中某些文本格式可能已经更改,因为它已经超出最多允许的字体数。】       原因: 是因为在POI处理xls的过程中,太多次调用了: HSSFFont font = hssfWorkbook.createFont(); 解决方法: 将font创建为全局变量,在需要使用的地方再调用进行单独的设置。
1607 0
C#语言之“中英文混合字符串对齐”的方法【转】
参考自:(1)http://www.cnblogs.com/cnluoke/articles/1213398.html            (2)http://www.cnblogs.com/sql4me/archive/2009/11/16/1603996.html 方法一:将已有字符串组织成新字符串时填充 由于某一个字段,包含有汉字和数字。
762 0
+关注
德哥
公益是一辈子的事, I&#39;m digoal, just do it.
2153
文章
245
问答
来源圈子
更多
阿里云数据库:帮用户承担一切数据库风险,给您何止是安心!支持关系型数据库:MySQL、SQL Server、PostgreSQL、PPAS(完美兼容Oracle)、自研PB级数据存储的分布式数据库Petadata、自研金融级云数据库OceanBase支持NoSQL数据库:MongoDB、Redis、Memcache更有褚霸、丁奇、德哥、彭立勋、玄惭、叶翔等顶尖数据库专家服务。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载