【问题标题】:Javascript - parseInt returns strange values for WebSocket dataJavascript - parseInt 返回 WebSocket 数据的奇怪值
【发布时间】:2015-11-06 05:40:59
【问题描述】:

我在使用 parseInt() 时遇到了一些奇怪的行为。

webSocket.onmessage = function (event) {
    var raw = event.data;
    alert(raw);
    var data = raw.split(":");

    alert("lat:\"" + data[0] + "\" lon:\"" + data[1] + "\"");

    var x = parseInt(data[0]);
    var y = parseInt(data[1]);

    alert("lat:" + x + " lon:" + y);
}

第一个警报输出:100:100 - 这是从服务器发送的字符串。

第二个警报输出:lat:"100" lon:"100" - 这很好

但是,第三个警报输出:lat:1 lon:NaN

这是什么原因造成的?

更新:

问题是服务器端的编码生成了一些不可见的不需要的字符。我更新了服务器代码,问题就消失了。 Working solution.

【问题讨论】:

  • 我很想知道...会是这么愚蠢的事情,我们甚至都没有想过:D
  • 可能是第二个数据中看不到的空格、制表符等字符
  • 无法重现:jsfiddle.net/oh9zygao
  • 如果你这样做会发生什么:var x = parseInt(data[0]) || 0;?
  • 你的浏览器是什么? :)

标签: javascript websocket parseint


【解决方案1】:

我的猜测是,您的数据中有不可打印的字符,例如空格、制表符等,这就是您在拆分后得到 NaN 的原因。

您可以使用regex 获取数据,如下所示。使用这种方式,您不必担心不可打印的字符,因为regex 只会选择数字。

var raw = '100:100 ';

var data = raw.match(/\d+/g);

var x = parseInt(data[0], 10);
var y = parseInt(data[1], 10);

document.write('x=' + x + '   y=' + y);

上面的regex会选择raw字符串中的所有数字。

【讨论】:

  • 这给了我一个个位数的数组。数据[0] = 1 数据[1] = 0 数据[2] = 0 数据[3] = 1 数据[4] = 0 数据[5] = 0
  • @user2667737 检查答案中的演示。请在 questin 中添加您在raw 中获得的数据
  • 这似乎有效,但不适用于event.data.. 它给出:“x=1 y=0”。但我认为你有一点,似乎有隐形字符。 event.data.length 返回 14,而打印输出只有 7 个字符..
  • 14 个字符?比你修剪raw 变量:raw.trim()。您能否提供完整的 url,您可以从中获取 2 个数据?
  • 服务器当前在本地运行。我怀疑那边有问题。这是用于从服务器发送字符串的代码(用 c# 编写):pastebin.com/Ti48xTrJ 基于本文中的代码:stackoverflow.com/a/12471677/2667737
【解决方案2】:

我同意@Tushar。因此,请相信raw = even.data; 中会解析一些特殊字符(尽管此处无法复制)

下面的代码似乎可以正常工作,您可以根据自己的代码进行调整并进行测试:

<script type="text/javascript">
    var raw = '100 :100asd';
    var data = raw.match(/[0-9]+/gm);

    alert(raw); // console.log(raw);
    var data = raw.split(":");

    alert("lat:\"" + data[0] + "\" lon:\"" + data[1] + "\"");

    var x = parseInt(data[0]);
    var y = parseInt(data[1]);

    alert("lat:" + x + " lon:" + y);
</script>

【讨论】:

  • 感谢您提供帮助,但我无法使用 raw = event.data.. 我现在尝试从计算机访问网页,alert(event.data) 给了我“1 0 0 : 1 0 0 "(由于某种原因,Android 浏览器不输出“空格”,document.write 也不输出)。这就解释了为什么长度是 14 - 每个数字之间都有一些东西。我尝试用raw.replace(/ /g, ''); 替换所有空格,但空格仍然存在,这意味着它们可能是别的东西。
  • @user2667737 我明白了。您仍然可以尝试将此替换为raw.replace(/[^\w\s]/gi, ''),因为我很确定在响应之间有一些 unicode :) 只是为了澄清一下:插入符号 (^) 是集合的否定 [...],我说全局且不区分大小写,此示例中的安全列表是数字、单词字符、下划线 (\w) 和空格 (\s)。
猜你喜欢
  • 2020-12-17
  • 2012-06-21
  • 1970-01-01
  • 2022-12-02
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多