检查字符串是不是仅包含数字
Posted
技术标签:
【中文标题】检查字符串是不是仅包含数字【英文标题】:Check if a string contains only number检查字符串是否仅包含数字 【发布时间】:2016-06-01 18:33:56 【问题描述】:我正在尝试检查 string
是否仅包含以下格式的有效数字
123.456
123
.356
但它应该拒绝任何包含非数字的内容,包括双点。以下是一些无效格式
d123.456
123d
12d3
d.1256
12d.456
12.d12
12.d45d
12.45.56
我做了以下事情
SELECT CASE WHEN '123.00' NOT LIKE '%[^0-9.]%' THEN 'Valid' ELSE 'Invalid' END
除了字符串中有多个点的情况外,何时似乎有效。
如何调整正则表达式以只允许一个点,否则返回“无效”?
【问题讨论】:
那些不是正则表达式 【参考方案1】:我建议try_convert()
:
select (case when try_convert(col, float) is not null then 'valid' else 'invalid' end)
一个可能的缺点是指数格式;例如,1e6
是一个有效的数字。
另一种方法是where
方法;你只需要更完整的逻辑:
select (case when col like '%[^0-9.]%' then 'invalid'
when col like '%.%.%' then 'invalid'
else 'valid'
end)
【讨论】:
谢谢你说的很有道理!【参考方案2】:有一个sql server内置函数:
Select CASE WHEN isnumeric([fieldname]) THEN 'Valid' ELSE 'Invalid" END
【讨论】:
ISNUMERIC 检查数据类型而不是值,因此任何字符串都将返回 false 选择 isumeric('123.00') 返回 true @MikeA 这绝对是错误的。 IsNumeric 不检查数据类型。那有什么意义呢?这个怎么样?选择 ISNUMERIC('1') IsNumeric 不是这里的答案。在这种情况下,它返回的误报太多了。 @MikeA 当输入表达式计算为数值数据类型时。这意味着它可以转换为数字数据类型。它与输入的数据类型无关。【参考方案3】:TRY_PARSE
将让您将输入值与您决定允许的任何/所有数字数据类型进行比较——例如:
SELECT
TRY_PARSE('123.456' as int) as [int],
TRY_PARSE('123.0' as float) as [float],
TRY_PARSE('d123.456' as int) as [int],
TRY_PARSE('d123.456' as float) as [float]
FWIW -- ISNUMERIC
经常被建议,并且肯定是最好的-听起来函数名称 :-) -- 但并不像大多数人所期望的那样工作。 (它允许数学和货币符号等)
【讨论】:
这是我得到的 Msg 195, Level 15, State 10, Line 14 'TRY_PARSE' 不是一个公认的内置函数名。 SQL Server 2012 +(对不起,我没有澄清)【参考方案4】:如果您不依赖正则表达式,SQL Server 有一个ISNUMERIC 函数可以用于此。
当输入表达式计算为有效的数值数据类型时,ISNUMERIC 返回 1;否则返回 0。
【讨论】:
ISNUMERIC 检查数据类型而不是值,因此任何字符串都将返回 false 他们的例子似乎有争议:SELECT name, **isnumeric(name) AS IsNameANumber**, database_id, isnumeric(database_id) AS IsIdANumber FROM sys.databases;
ISNUMERIC 是一个可怕的命名函数。它应该更像是 ValueIsSomethingThatCanBeConvertedToAnyDatatypeThatIsRoughlyANumber。例如 1e3 将返回 true。
@MikeA 这绝对是错误的。 IsNumeric 不检查数据类型。那有什么意义呢?这个怎么样?选择 ISNUMERIC('1')
我同意它评估表达式,但它也接受 +-、货币符号和 e 表示幂。以上是关于检查字符串是不是仅包含数字的主要内容,如果未能解决你的问题,请参考以下文章
如何检查给定的 c++ 字符串或 char* 是不是仅包含数字?