Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式/Javascript:将度分秒转换为十进制度_Javascript_Regex - Fatal编程技术网

正则表达式/Javascript:将度分秒转换为十进制度

正则表达式/Javascript:将度分秒转换为十进制度,javascript,regex,Javascript,Regex,我在使用正则表达式将javascript中的DMS转换为DD时遇到问题。我从geoserver获取了这段代码,但它似乎不起作用。我希望它能够用正确或非常接近的答案转换我的所有测试用例 我真的不在乎这个函数是完全的javascript还是重正则表达式,我只需要它工作 您可以在JSFIDLE上测试它 以下是我的测试用例: dmsToDeg('n0301'37'); dmsToDeg('03 01 37'); dmsToDeg('03 01'37“N”); dmsToDeg('076 40'35“W

我在使用正则表达式将javascript中的DMS转换为DD时遇到问题。我从geoserver获取了这段代码,但它似乎不起作用。我希望它能够用正确或非常接近的答案转换我的所有测试用例

我真的不在乎这个函数是完全的javascript还是重正则表达式,我只需要它工作

您可以在JSFIDLE上测试它

以下是我的测试用例: dmsToDeg('n0301'37'); dmsToDeg('03 01 37'); dmsToDeg('03 01'37“N”); dmsToDeg('076 40'35“W”); dmsToDeg('W 076 40'35“); dmsToDeg('N 05 11'17“)

这是我的密码:

function dmsToDeg (dms) {
    if (!dms) {
        return Number.NaN;
    }
    var neg = dms.match(/(^\s?-)|(\s?[SW]\s?$)/) != null ? -1.0 : 1.0;
    dms = dms.replace(/(^\s?-)|(\s?[NSEW]\s?)$/, '');
    dms = dms.replace(/\s/g, '');
    var parts = dms.match(/(\d{1,3})[.,°d ]?\s*(\d{0,2})[']?(\d{0,2})[.,]?(\d{0,})(?:["]|[']{2})?/);
    if (parts == null) {
        return Number.NaN;
    }
    // parts: 
    // 0 : degree 
    // 1 : degree 
    // 2 : minutes 
    // 3 : secondes 
    // 4 : fractions of seconde 
    var d = (parts[1] ? parts[1] : '0.0') * 1.0;
    var m = (parts[2] ? parts[2] : '0.0') * 1.0;
    var s = (parts[3] ? parts[3] : '0.0') * 1.0;
    var r = (parts[4] ? ('0.' + parts[4]) : '0.0') * 1.0;
    var dec = (d + (m / 60.0) + (s / 3600.0) + (r / 3600.0)) * neg;
    return dec;
}

问题是您正在删除所有空格,因此“03 01 37”变为“030137”。然后,regex
\d{1,3}
匹配三位数字“030”。您应该向正则表达式中添加可选的分隔符,而不是从输入中剥离它们

可能还有其他事情,但这是我第一次看到


正如您所发现的,解析lat/lon值比看起来要困难。如果您可以重复使用其他人的代码,您应该这样做。

这并不难,下面假设传入了正确的格式,您可能需要对此进行一些验证。它也不会格式化输出,如果需要,可以使用通用格式化函数(同样,不难写,最多大约5行代码)

很可能您正在将其输入另一个计算(度到弧度的转换?),因此可能不需要格式化。请注意,javascript数字不能准确地表示所有十进制数字,因此要小心四舍五入。不过,精度对于大多数用途来说是足够的

function dms2deg(s) {

  // Determine if south latitude or west longitude
  var sw = /[sw]/i.test(s);

  // Determine sign based on sw (south or west is -ve) 
  var f = sw? -1 : 1;

  // Get into numeric parts
  var bits = s.match(/[\d.]+/g);

  var result = 0;

  // Convert to decimal degrees
  for (var i=0, iLen=bits.length; i<iLen; i++) {

    // String conversion to number is done by division
    // To be explicit (not necessary), use 
    //   result += Number(bits[i])/f
    result += bits[i]/f;

    // Divide degrees by +/- 1, min by +/- 60, sec by +/-3600
    f *= 60;
  }

  return result;
}

alert( 
  dms2deg('S 023 30\'') + '\n' +      // -23.5
  dms2deg('N 023 00\' 00\"') + '\n' + //  23
  dms2deg('W 117 23\' 23.32\"')       // -117.3898111111111
);
功能dms2deg(s){
//确定是南纬还是西经
var sw=/[sw]/i.测试;
//根据sw(南或西is-ve)确定标志
var f=sw?-1:1;
//进入数字部分
变量位=s.match(/[\d.]+/g);
var结果=0;
//转换为十进制度数

对于(var i=0,iLen=bits.length;iYeah,我从GeoServer源代码获得了这段代码,但我的正则表达式很糟糕,所以我不知道如何修复它。:/Wow,你的代码通过了我的测试用例,还有一些非常出色。非常感谢!它干净、简单,而且最有效!我喜欢它。