测试toLocaleString支持

时间:2015-08-07 07:18:33

标签: javascript safari

我使用toLocaleString格式化英国工作薪水,传递货币选项,如下所示:

tempSalary = parseInt(salary).toLocaleString('en-gb', { style: 'currency', currency: 'GBP'});

我知道这在Safari中没有正确实现,但我可以提前检查输出其他内容吗?根据{{​​3}},我可以检查区域设置和选项参数吗?如果不支持,请不要打扰脚本?

我更愿意检查是否支持,而不仅仅是检查是否使用Safari(因为IE10-也没有完全支持它)。

2 个答案:

答案 0 :(得分:5)

ECMA-402表示要支持 Number.prototype.toString 的选项,实现必须:

  1. 与ECMAScript Ed 5.1及其后继者保持一致
  2. 扩展内置的 Number.prototype
  3. 实施 Intl 全局对象
  4. 支持 Intl.NumberFormat 构造函数
  5. 基于此,支持测试是:

    if (typeof Intl == 'object' && typeof Intl.NumberFormat == 'function') {
    
      // toLocaleString with options supported
    
    } else {
    
      // host dependent
    
    }
    

    作为一项功能:

    function toLocaleStringSupportsOptions() {
      return !!(typeof Intl == 'object' && Intl && typeof Intl.NumberFormat == 'function');
    }
    

    当然必须进行广泛的测试。它适用于我测试的几个更流行的浏览器,有些支持和不支持 Intl.NumberFormat

    但是实现中可能存在错误。我能想到的唯一一个可能会发生的事情是,某些人可能无法返回 typeof 的预期值,即使他们被要求(例如,过去曾有浏览器返回' unknown& #39;而不是'对象'对象'而不是'功能')。此外,如果提供选项参数,则不需要ECMA-262 ed 3实现抛出错误,因此基于 try..catch 的检测可能会在这些主机中失败。

    以下是一个更宽容的版本(但我会使用上述内容,直到我发现需要它的主机):

    function toLocaleStringSupportsOptions() {
      return !!(typeof Intl != 'undefined' && Intl && typeof Intl.NumberFormat != 'undefined');
    }
    

答案 1 :(得分:1)

也许你可以像MDN建议的那样创建一个函数。并相应地处理错误。



function toLocaleStringSupportsLocales() {
  var number = 0;
  try {
    number.toLocaleString('i');
  } catch (e) {
    return e​.name === 'RangeError';
  }
  return false;
}