JavaScript判断字符是否为decimal

在C#语言环境下,可以使用

string xxx = "123.45";
decimal dec;
if (decimal.TryParse(xxx, out dec)) //返回 true or false
{
    // true, do some thing.
}
else
{
    //false, do some thing.
}

 

但是,如果在javascript语境中呢?你是可以参考下面函数来实现:
2026-04-09_15-53-24

function isDecimal(str) {
    // 去除首尾空格
    str = str.trim();
    // 空字符串不算有效数字
    if (str === "") return false;
    // 使用 parseFloat 尝试转换
    let num = parseFloat(str);
    // 检查转换结果是否为有效数字,并且要求字符串必须**完全**表示该数字(避免 "123abc" 之类)
    return !isNaN(num) && /^-?\d+(?:\.\d+)?$/.test(str);
}
View Code

 

实例:

var sjz= document.getElementById('<%= HiddenFieldShiJiZhi.ClientID %>').value;
var metric = isDecimal(sjz) ? parseFloat(sjz).toFixed(8).replace(/\.?0+$/, '') : sjz;

以上实现,判断字符串是否为decimal?
如果是,把小数点后最后一数字后的0去除。
如果非decimal,返回原字符串。


其实,在数据库,如MS SQL Server还会需要判断的。
在新版本如2012+可以使用,TRY_CAST和TRY_CONVERT

如果您的SQL Server版本较低,得想想一个替代方案?或者
升级数据库兼容级别(ALTER DATABASE ... SET COMPATIBILITY_LEVEL = 160)来完整支持新函数。

以下内容于2026/4/10 10:37补充
2026-04-10_10-38-59

-- =============================================
-- Author:        leo yeung  
-- Create date: 2026-04-10
-- Description:    判断字符串是否为decimal
-- =============================================
CREATE FUNCTION [dbo].[svf_IsDecimal] 
(
    @Str NVARCHAR(100)
) RETURNS BIT
AS
BEGIN
    DECLARE @Result BIT = 0
    SET @Str = LTRIM(RTRIM(@Str))  -- 去除首尾空格

    -- 空字符串直接返回 0
    IF LEN(@Str) = 0
        RETURN 0

    -- 使用 CASE 进行逐层校验(比 AND 链更清晰)
    IF (
        -- 1. 基本格式正则(不允许前导/后导空格、只允许数字、可选负号、可选小数点、小数部分必须有数字)
        @Str LIKE '[+-]%'       -- 可选正负号开头
        OR @Str LIKE '[0-9]%'   -- 或者数字开头
    )
    AND @Str NOT LIKE '%[^-+0-9.]%'   -- 只允许数字、负号、正号、小数点
    AND @Str NOT LIKE '%[+-]%[+-]%'   -- 只允许一个正/负号,且必须在开头
    AND CHARINDEX('.', @Str) <= 1     -- 小数点最多一个,且不能出现在正负号之前
    AND LEN(@Str) - LEN(REPLACE(@Str, '.', '')) <= 1  -- 确保小数点个数 <=1
    AND (
        CHARINDEX('.', @Str) = 0      -- 没有小数点时,全部是数字(可能有正负号)
        OR (
            CHARINDEX('.', @Str) > 0
            AND LEN(SUBSTRING(@Str, CHARINDEX('.', @Str) + 1, LEN(@Str))) >= 1  -- 小数部分至少一位
            AND CHARINDEX('.', @Str) > CASE WHEN @Str LIKE '[+-]%' THEN 2 ELSE 1 END  -- 整数部分至少一位
        )
    )
    AND @Str NOT LIKE '%[^0-9]%'      -- 去除正负号和小数点后,剩下全是数字
    BEGIN
        SET @Result = 1
    END

    -- 可选:进一步排除科学计数法(如果担心 '1E2' 等,但上面的正则已经排除 E)
    IF CHARINDEX('E', UPPER(@Str)) > 0
        SET @Result = 0

    RETURN @Result
END
View Code


另外一个版本,可供参考,
2026-04-10_10-49-11

 

 
-- =============================================
-- Author:        leo yeung  
-- Create date: 2026-04-10
-- Description:    判断字符串是否为decimal
-- =============================================
 CREATE FUNCTION [dbo].[svf_IsDecimal]
(
    @number NVARCHAR(100)
)
RETURNS BIT
AS
BEGIN
    SET @number = LTRIM(RTRIM(@number))
    IF @number = '' OR @number IS NULL
        RETURN 0

    -- 排除科学计数法(含 E 或 e)
    IF UPPER(@number) LIKE '%E%'
        RETURN 0

    -- 利用 ISNUMERIC + 'e0' 技巧快速过滤大多数非法格式
    IF ISNUMERIC(REPLACE(REPLACE(@number, '+', 'A'), '-', 'A') + 'e0') = 0
        RETURN 0

    -- 额外排除仅包含正负号或小数点的情况
    IF @number IN ('.', '+', '-', '+.', '-.')
        RETURN 0

    -- 排除多个小数点、小数点位置不正确等(可选,上述 e0 已经能拦截大多数)
    IF LEN(@number) - LEN(REPLACE(@number, '.', '')) > 1
        RETURN 0
    RETURN 1
END
GO
View Code

 




 

posted @ 2026-04-09 16:15  Insus.NET  阅读(0)  评论(0)    收藏  举报