【问题标题】:Failing conversion of string to int in JavaScript在 JavaScript 中将字符串转换为 int 失败
【发布时间】:2015-02-08 14:22:47
【问题描述】:

我正在尝试从 2d php 字符串数组中获取输入,并将 arr[i][1] 中的值(其中 i 可以被视为行,1 可以被视为矩阵中的列)转换为整数,如下所示:

JavaScript 函数:

var _input = <? php echo json_encode($output); ?> ; //2D String
var _sro = []; //string
var _src = []; //string
var _sru = []; //string

var aL = _input.length;
for (var i = 0; i < aL; i++) {
  _sro.push(_input[i][0]); //string
  _src.push(_input[i][1]); //string
  _sru.push(_input[i][2]); //string
}

alert(_src.toString()); //result = 1,1,2,9,6,1,24...
alert(typeof(_src).toString()); //res = string

var _lb = new Array(); //empty
var _dt = new Array(); //empty

for (var i = 0; i < aL; i++) {
  _dt.push(parseInt(_src[i])); //convert to int and push to arr
}

alert(_dt.toString()); //result = NaN,NaN,NaN,NaN.....
alert(typeof(_dt).toString()); //res = string

_lb = _sro;

我遇到的问题是 _dt 的每个值的最终输出是 NaN,这意味着它没有得到适当的转换。为了解决这个问题,我尝试了以下方法:

  1. 使用 parseInt
  2. 使用 Number()
  3. 使用“+”运算符
  4. 同时使用 parseInt 和 Number()

例如:

for (var i = 0; i < aL; i++) {
  _dt.push(Number(parseInt(_src[i]))); //convert to int and push to arr
}

所有这些都失败了。我真的很迷茫,经过 2 天的谷歌搜索后,我的想法已经用完了,也许有智慧的人可以提供帮助,在此先感谢您。

编辑:

PHP函数:

下面的函数生成传递给 JS 的 PHP 数组:

//set error reporting
error_reporting(E_ALL & ~E_NOTICE);

//set variables
$result = array();
$output = array();

//read in csv file
foreach(file("1OnScreen.csv") as $key => $str) {
  if ($key == 0)
    continue; // skip first line

  $values = str_getcsv($str, "\t", '', '');
  $result[] = $values;
}
$output = $result;

CSV 数据

CSV 文件包含以下数据,分隔符为 \t:

Owner	Count	Unassigned	Other
AA1	1	0	1
AD	1	0	1
AR	2	0	2
BW	9	0	9
CM	6	0	6
CT	1	0	1
DB	24	0	24
EU	8	0	8
GM	5	0	5
GO	21	0	21
JF	1	0	1
JW	2	0	2
NH	10	0	10
RB	2	0	2
SPC	4	0	4
SP	2	0	2
TC	2	0	2
TG	1	0	1
VS	4	0	4

JS 中的 JSON 输出 _input 的输出,正如我在运行 alert(_input) 时看到的那样,我认为新行开头的逗号可能会影响转换并使其失败,但我不知道如何解决这个问题。

AA1,1,0,1
,AD,1,0,1
,AR,2,0,2
,BW,9,0,9
,CM,6,0,6
,CT,1,0,1
,DB,24,0,24
,EU,8,0,8
,GM,5,0,5
,GO,21,0,21
,JF,1,0,1
,JW,2,0,2
,NH,10,0,10
,RB,2,0,2
,SPC,4,0,4
,SP,2,0,2
,TC,2,0,2
,TG,1,0,1
,VS,4,0,4

【问题讨论】:

  • 你确定_src[i] 是一个格式正确的字符串吗?试试for (var i = 0; i &lt; aL; i++) { _dt.push(parseInt(_src[i].toString())); }
  • 能否请您提供 _input 数组作为 javascript 变量而不是 php 内联脚本?
  • 我也会尝试for (var i = 0; i &lt; aL; i++) { alert(_src[i].toString()); alert(typeof(_src[i]).toString()); _dt.push(parseInt(_src[i].toString())); } 了解发生了什么
  • @dirluca 来自 for 循环的警报也返回 NaN。我已经仔细检查了正在传递的数组,似乎数组没有被正确解析。我使用 var _input = [["AA","1","0","1"],["AD","2","0","7"],[" 包含了相同的数据BW","5","0","9"]];现在它可以正常工作了。
  • this jsfiddle。有用。您确定这是您正在使用的完整代码,并且您没有发布 sn-p 以消除错误吗?

标签: javascript php arrays csv type-conversion


【解决方案1】:

由于从 PHP 脚本传递的 JSON 字符串中的某些特殊字符以及“如果第一个字符无法转换为数字,则 parseInt() 返回 NaN”,转换失败。 W3C Source

为了解决失败的转换,或者更确切地说防止它发生,使用正则表达式会派上用场(提供正则表达式教程here)将导致替换除 1-9 之外的所有字符(根据 this question ) 如:/[^1-9 ]/g 尝试将字符串转换为数字时,使完整代码如下所示:

var _srOwner = <? php echo json_encode($sro_o); ?> ;
var _srCount = <? php echo json_encode($src_o); ?> ;
var _srUnassigned = <? php echo json_encode($sru_o); ?> ;

var _srC = [];
var _srU = [];


var aL = _srCount.length;
var cs = "";
var us = "";
var csi = "";
var usi = "";
var cn = 0;
var un = 0;
for (var i = 0; i < aL; i++) {
  cs = String(_srCount[i]); //string
  us = String(_srUnassigned[i]); //string
  csi = cs.replace(/[^1-9]/g, ""); //string
  usi = us.replace(/[^1-9]/g, ""); //string
  cn = parseInt(csi);
  un = Number(usi);
  _srC.push(cn);
  _srU.push(un);
};

同时使用parseInt()Number() 的转换成功,您可以使用this question 作为选择哪一个的指导。

特别感谢 @dirluca 对这个问题的贡献和伟大的指点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2011-03-06
    • 1970-01-01
    相关资源
    最近更新 更多