防止将包含 E 和数字的字符串转换为数字

Posted

技术标签:

【中文标题】防止将包含 E 和数字的字符串转换为数字【英文标题】:Prevent converting string containing an E and numbers to number 【发布时间】:2013-02-03 03:32:56 【问题描述】:

我们遇到这种“奇怪”的情况,当在 jquery click 函数中检索时,存储在数据属性(例如 data-prodcode)中的某些产品代码(例如 11E6)被转换为 11000000。像这样的:

    <a data-prodcode="11E6">click</a>
    var code = $(this).data('prodcode');
    console.log(code); --> 11000000

关于如何避免这种行为或可能导致这种行为的任何建议?

【问题讨论】:

这是因为.data 会尽可能将值自动转换为数字或布尔值,而字符串11E6 在计算机上看起来就像a number in scientific notation。 【参考方案1】:

来自documentation:

每次尝试都将字符串转换为 javascript 值 (这包括布尔值、数字、对象、数组和空值)否则 它作为一个字符串留下。将值的属性作为字符串检索 不尝试转换它,使用 attr() 方法。

您可以使用attr 以避免自动解析:

var code = $(this).attr('data-prodcode');

更准确地说:这不应该发生。事实上,它不会在最新版本中发生。这是current的jQuery的代码(最有趣的部分是注释):

    if ( typeof data === "string" ) 
        try 
            data = data === "true" ? true :
                data === "false" ? false :
                data === "null" ? null :
                // Only convert to a number if it doesn't change the string
                +data + "" === data ? +data :
                rbrace.test( data ) ? jQuery.parseJSON( data ) :
                    data;
         catch( e ) 

它在 jQuery 1.8 和 1.9 中工作:如果反向转换不产生相同的字符串,它不会将字符串转换为数字。但它在 jQuery 1.7 中不起作用。

【讨论】:

请务必在您的代码中添加注释,解释您这样做的原因,这样一些善意的优化器以后不会再改回来。 事实上,在我看来,jQuery 的data 函数对于字符串来说是非常危险的。看起来他们真的想在这里变得太聪明了...... 嗯,这可能是一个极端情况。在所有情况下都需要字符串的任何人都可以并且应该使用您的解决方案,这可能比.data 更有效。 @Blazemonger 我研究了 jQuery 的代码。实际上这是一个错误,现在已修复(或者可能已修复,它不是那么简单的代码......)。 对我们来说不太聪明,没有阅读文档 :) 感谢@dystroy @Blazemonger 的超快速响应/帮助

以上是关于防止将包含 E 和数字的字符串转换为数字的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB以科学计数法将数字转换为字符串

防止 ColdFusion 使用 SerializeJSON 将字符串转换为数字

如何将列转换为数字,而它同时包含字符串和数字作为字符串

类型“数字”不可分配给类型“字符串”。如何将数字转换为字符串

使用有限的类 C 库将科学计数法字符串中的数字转换为浮点数

如何在 C# 中将 E+ 数字从字符串转换为十进制? [复制]