【问题标题】:Javascript replace string with 8 and 9 doesn't work...but other numbers do...?Javascript 用 8 和 9 替换字符串不起作用...但是其他数字可以...?
【发布时间】:2011-10-29 00:55:19
【问题描述】:

查看此脚本...运行并查看奇怪之处..

http://jsfiddle.net/BjJTc/

来自 jsfiddle

var m = 'Jan07';
var mm = 'Jan';
alert(m.replace(mm, ''));
alert(parseInt(m.replace(mm, '')));

var m = 'Jan08';
var mm = 'Jan';
alert(m.replace(mm, ''));
alert(parseInt(m.replace(mm, '')));


var m = 'Jan09';
var mm = 'Jan';
alert(m.replace(mm, ''));
alert(parseInt(m.replace(mm, '')));


var m = 'Jan10';
var mm = 'Jan';
alert(m.replace(mm, ''));
alert(parseInt(m.replace(mm, '')));

【问题讨论】:

  • parseInt不是问题,不是替换问题。

标签: javascript replace


【解决方案1】:

这是一个八进制问题:尝试parseInt(val, 10)。前导零使它相信它是八进制的。 parseInt 接受第二个可选参数 radix:

radix 表示上述基数的整数 细绳。虽然此参数是可选的,但始终将其指定为 消除读者的困惑并保证可预测的行为。 当基数是不同的实现产生不同的结果 未指定。

所以:

parseInt('09') // 0
parseInt('09', 10); // 9

【讨论】:

  • 您应该始终为parseInt 提供一个基数。
  • jsFiddle 的 jsLint 对此发出警告。
  • 非常有意义。谢谢!
  • 更好的是:使用Number 将字符串转换为数值
  • @Kooilc,如果你想要一个整数就不要
【解决方案2】:

您遇到了基数问题。 Javascript 将 07, 08, 09 解释为八进制数。十进制 7 和八进制 07 计算为相同的数字,而 8 和 9 则不然。

在所有parseInt() 调用中包含以 10 为底的基数作为第二个参数:

var m = 'Jan08';
var mm = 'Jan';
alert(m.replace(mm, ''));
alert(parseInt(m.replace(mm, ''), 10));
// ------------------------------^^^^^^

【讨论】:

  • @jackJoe 十进制 7 与八进制 07 相同。但 8 和 9 不是。
  • 不奇怪!八进制的 7 等于十进制的 7!
【解决方案3】:

如果您尝试从您拥有的字符串中获取年份,您可以尝试将其解析为日期,然后提取年数...

var m = 'Jan07';
var d = Date.parse('01' + m); // Parse the 1st of the month
var y=Math.floor(d/(1000*60*60*24*365.24)) + 1970; // Convert to years since 1970, then add 1970
alert(y);

不是最优雅的解决方案,但会让你从你的 MMMyy 格式中获得一年。

【讨论】:

    【解决方案4】:

    或者只是丢失前导字母和任何前导 0-

    m='Jan08';
    mm=/^\D+0?/,'');
    alert(m.replace(mm, ''));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多