今天正在与IsNumeric进行一些基准测试,并将其与以下功能进行比较:
Private Function IsNumeric(ByVal str As String) As Boolean
If String.IsNullOrEmpty(Str) Then Return False
Dim c As Char
For i As Integer = 0 To Str.Length - 1
c = Str(i)
If Not Char.IsNumber(c) Then Return False
Next
Return True
End Function
Run Code Online (Sandbox Code Playgroud)
我对结果非常惊讶.使用数值时,这个数字比常规IsNumeric()快8到10倍,而使用空数字或非数字值则快1000-1500倍.
什么是IsNumeric这么久?在用上面的功能替换之前,我应该考虑一些其他问题吗?我在我的网站上的大约50个不同的地方使用IsNumeric,主要用于验证表单和查询字符串.
我一直在寻找一个 SQL 函数来测试一个值是 alpha 还是数字。Informix 7.3 似乎没有任何这样的功能,但我可能错过了一些东西或者一直在寻找错误的东西。
例如,我试图测试一个电话号码字段是否只有数字并相应地处理它:
鉴于此表的电话字段类型为char(12):
id name phone
5164 Cheese 973-153-5149
8843 Queso (201)8011830
8356 Formaggio 2129182943
8938 Ost ext.21438
3852 Ser 973-15-1549
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情:
SELECT CASE WHEN (ISALPHA((TRIM(REPLACE((REPLACE((REPLACE((REPLACE((REPLACE(phone,'-','')),'(','')),')','')),' ','')),'.','')))))
THEN 'has alpha chars'
WHEN (LENGTH((TRIM(REPLACE((REPLACE((REPLACE((REPLACE((REPLACE(phone,'-','')),'(','')),')','')),' ','')),'.','')))) NOT IN (10,11))
THEN 'wrong length'
WHEN (phone IN ('',' ',NULL)))
THEN 'phone is blank'
ELSE (TRIM(REPLACE((REPLACE((REPLACE((REPLACE((REPLACE(phone,'-','')),'(','')),')','')),' ','')),'.','')))
END phone
FROM given_table;
Run Code Online (Sandbox Code Playgroud)
基本上,我试图从电话号码中删除任何-, (, ), ,.字符,修剪该结果,测试它的长度是否为 10 或 11 个字符,并确保数据中没有 alpha 字符。替换和修剪。(如果您觉得我将如何替换和修剪有任何问题,我也愿意在这方面提出建议。正则表达式?) …
我遇到sqlserver的ISNUMERIC函数问题,它为','返回true
我正在解析一个邮政编码并试图查看第二个字符(应该是一个数字)是否为0,并在每种情况下做一些不同的事情.问题是我不能通过首先检查isNumeric来转换char.这是我的标量值函数的代码,用于返回第二个char位置的数字,如果不是数字,则返回-1.
@declare firstDigit int
IF ISNUMERIC(SUBSTRING(@postal,2,1) AS int) = 1
set @firstDigit = CAST(SUBSTRING(@postal,2,1) AS int)
ELSE
set @firstDigit = -1
RETURN @firstdigit
Run Code Online (Sandbox Code Playgroud)
由于这在邮政编码不太有效时失败了.我只是试图找出如何检查nvarchar @postal的第二个字符是否是0-9的数字.我见过不同类型的解决方案,如使用LIKE [0-9]或使用PATINDEX等.
是否有更好/更简单的方法来做到这一点,如果不是哪种方法将是最快的?
编辑:根据Aaron Bertrand的建议添加代码
ON z.postal =
CASE
WHEN CONVERT(INT, CASE WHEN SUBSTRING(v.patientPostal,2,1) LIKE '[0-9]'
THEN SUBSTRING(v.patientPostal, 2,1) END) = 0 then v.patientPostal
WHEN CONVERT(INT, CASE WHEN SUBSTRING(v.patientPostal,2,1) LIKE '[0-9]'
THEN SUBSTRING(v.patientPostal, 2,1) END) > 0 then LEFT(v.patientPostal,3)
Run Code Online (Sandbox Code Playgroud) 这是一个示例查询:
DECLARE @table table (loc varchar(10))
INSERT INTO @table VALUES
('134a'), ('123'), ('abc'), ('124')
SELECT *
FROM (
SELECT * FROM @table WHERE ISNUMERIC(loc) = 1
) as a
WHERE CAST(loc as INT) BETWEEN 100 AND 200
Run Code Online (Sandbox Code Playgroud)
如果我有一些varchar值,并且我ISNUMERIC在查询中的派生表中使用它们将它们限制为数值,为什么会导致转换错误?:
将varchar值'134a'转换为数据类型int时转换失败.
有没有解决的办法?
我想从像这样的字符串中解析出年份信息
$8995 四月 18 2008 本田思域混合动力 $8995 (奥勒姆) 图片地图汽车和卡车 - 由车主
由于我在线检索该字符串,因此有时年份元素不在同一位置。我这样做的方法是使用 split 函数按空格分割字符串,然后检查数组的每个节点是否仅包含数字。
但是,当我使用函数 IsNumeric 时,它也返回“$8995”节点。
检查字符串是否只包含数字,没有“$”,没有“.”,而不包含其他任何内容的好方法是什么?
或者在我的情况下,是否有更好的方法来检索年份信息?
谢谢。
我有要测试的字段,并确保它们仅接受integers。功能很少,但是我不确定哪个是最好的。首先,我尝试了一下,isValid("integer",value)但是发现“ 1,5”将被接受为整数。因此,我尝试了一下,isNumeric(value)但是它将接受类似的值1.5。我想知道什么是检查整数的最佳方法?也许两个结合了这两个功能,例如:
<cfif isValid("integer",value) AND isNumeric(value)>
Run Code Online (Sandbox Code Playgroud)
还是有更好的方法来做到这一点?
我在VB.NET中有一个函数循环遍历值并尝试将其转换为十进制,如果IsNumeric为True,
Dim Value As String
If IsNumeric(Value) = True Then
Rate = CType(Value, Decimal) <--- bombing here
End If
Run Code Online (Sandbox Code Playgroud)
我发现当函数接收到值603E43 IsNumeric由于某种原因求值为True然后轰炸转换.IsNumeric在这种情况下为什么会这样?
如何检查该值是否为数字?我尝试的是数字,但它返回一个错误,指出该函数未找到。
例子:
select *isnumeric*("abc") // returns 0 or false
select *isnumeric*("123") // returns 1 or true
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来检测年份,例如 2019 年。我认为的要求是数字是连续的,有四位数字,并且不与字母或特殊字符相邻。所以我想让方法在以下每种情况下返回“2019”:
\n\n"2019"\n"in 2019\n"Before 2019, all IOS apps were written in one of 2 ways"\nRun Code Online (Sandbox Code Playgroud)\n\n但将其排除在外:
\n\n"1234z20191234\nRun Code Online (Sandbox Code Playgroud)\n\n有很多方法可以检测字符串中的数字,如下所示
\n\nlet newString = origString\n .components(separatedBy:CharacterSet.decimalDigits.inverted)\n .joined(separator: "")\nRun Code Online (Sandbox Code Playgroud)\n\n但他们不会提取每个数字序列来测试长度和邻接性。
\n\n数据检测器可以尝试提取日期,但从可能的日期到起始文本中可能存在的年份似乎容易出错,例如使用以下内容:
\n\n\xe2\x80\x9c2018-08-31 04:00:00 +0000\xe2\x80\x9d, \xe2\x80\x9cAmerica/Los_Angeles\xe2\x80\x9d, 18000.0\nRun Code Online (Sandbox Code Playgroud)\n\n谁能建议一种从字符串中检索数字年份的可靠方法?
\n我正在尝试理解 PHP 中的数字字符串。我有以下代码:
var_dump(5 * "10 abc");
var_dump(is_numeric("10 abc"));
Run Code Online (Sandbox Code Playgroud)
这给了我输出:
int(50)
bool(false)
Run Code Online (Sandbox Code Playgroud)
这让我感到困惑,因为字符串“10 abc”似乎被解释为第一个表达式中的数字字符串(因此 int(50) 输出并且没有关于使用非数字值的警告),但是当通过 is_numeric() 运行时函数它返回 false,表明它实际上不是数字字符串。
我花了一些时间查看文档来理解这种行为,但找不到任何具体的答案,有人可以帮助解释是什么导致了这种行为吗?
我知道 PHP 8.0.0 对数字字符串的含义进行了一些更改,但这是我现在正在尝试理解的 PHP 7.1.33。
我从mysql数据库中获取文本,我通过URL中的ID获取它:
site.php?id = 1等等
什么被认为是最安全的防止SQL注入和东西.这种方式是否正确:
<?php
$news_id = $_GET['news_id'];
if(!is_numeric($news_id)) die('Wrong');
//mysql_query and stuff here
?>
Run Code Online (Sandbox Code Playgroud)
或者这样:
<?php
$news_id = $_GET['news_id'];
if(!intval($news_id)) die('Wrong');
//mysql_query and stuff here
?>
Run Code Online (Sandbox Code Playgroud)