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语境中呢?你是可以参考下面函数来实现:
function isDecimal(str) { // 去除首尾空格 str = str.trim(); // 空字符串不算有效数字 if (str === "") return false; // 使用 parseFloat 尝试转换 let num = parseFloat(str); // 检查转换结果是否为有效数字,并且要求字符串必须**完全**表示该数字(避免 "123abc" 之类) return !isNaN(num) && /^-?\d+(?:\.\d+)?$/.test(str); }
实例:
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补充,
-- ============================================= -- 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
另外一个版本,可供参考,
-- ============================================= -- 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

浙公网安备 33010602011771号