正则表达式/Javascript将小数分钟数转换为小数度 [英] Regex/Javascript to transform Degrees Decimal Minutes to Decimal Degrees

查看:68
本文介绍了正则表达式/Javascript将小数分钟数转换为小数度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在GeoServer源代码中找到了一个函数,该函数使我可以将Java中的度数秒转换为十进制度数.但是我需要将十进制分钟数转换为十进制度数.

当前功能将执行以下操作:

 输入:N 03°01’37"输出:30.016666666666666 

但是我需要一个可以做到这一点的函数:

 输入:26°23.90473输出: ???? 

最好的答案是调整现有的RegEx,但是任何将其转换的Javascript解决方案都可以.

这是当前功能: 但是我需要它接受度数小数分钟而不是度数分秒.

  dmsToDeg:function(dms){如果(!dms){返回Number.NaN;}var neg = dms.match(/(^ \ s?-)|(\ s?[SW] \ s?$)/)!=空吗?-1.0:1.0;dms = dms.replace(/(^ \ s?-)|(\ s?[NSEW] \ s?)$/,'');dms = dms.replace(/\ s/g,'');var parts = dms.match(/(\ d {1,3})[.,°d]?(\ d {0,2})[']?(\ d {0,2})[.,]?(\ d {0,})(?:[] | ['] {2})?/);if(parts == null){返回Number.NaN;}//部分://0:度//1:度//2分钟//3:秒//4:秒的分数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;返回dec;}, 

解决方案

新功能...

  dmsToDeg:function(dms){如果(!dms){返回Number.NaN;}var neg = dms.match(/(^ \ s?-)|(\ s?[SW] \ s?$)/)!=空吗?-1.0:1.0;dms = dms.replace(/(^ \ s?-)|(\ s?[NSEW] \ s?)$/,'');var parts = dms.match(/(\ d {1,3})[.,°d]?\ s *(\ d {0,2}(?:\.\ d +)?)[']?/);if(parts == null){返回Number.NaN;}//部分://0:度//1:度//2分钟var d =(parts [1]?parts [1]:'0.0')* 1.0;var m =(parts [2]?parts [2]:'0.0')* 1.0;var dec =(d +(m/60.0))* neg;返回dec;} 

我删除了正则表达式的最后一部分,该部分捕获了几秒钟和几分之一秒.我已经添加了捕获分钟的部分(?:\.\ d +)?这是一个非捕获组(?:)-因为我们不需要它分别记录到分钟的整数部分.它需要一个小数点( \.),然后是一个或多个数字( \ d + ).整个组是可选的(?)-即输入仍然可以是整数.

根据您的评论,我对其进行了修改,使其与空格无关....现在,它查找一个整数,后跟一个空格或以下字符之一:.,°d",然后是小数分钟.解决方案还发布到您的jsfiddle中: http://jsfiddle.net/NJDp4/6/

I found a function in the GeoServer source that will allow me to convert Degrees Minutes Seconds to Decimal Degrees in Javascript. But i need to conver Degrees Decimal Minutes to Decimal Degrees.

Current function will do this:

   input: N 03° 01’ 37" 
   output: 30.016666666666666

But i need a function that will do this:

   input: 26° 23.90473
   output: ????

The best answer would be to tweak the existing RegEx but any Javascript solution that converts it will do.

Here's the current function: But i need it to accept Degrees Decimal Minutes instead of Degrees Minutes Seconds.

dmsToDeg: function(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]?(\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; 
    },

解决方案

New function...

dmsToDeg: function(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?)$/,''); 
        var parts=dms.match(/(\d{1,3})[.,°d ]?\s*(\d{0,2}(?:\.\d+)?)[']?/); 
        if (parts==null) { 
            return Number.NaN; 
        } 
        // parts: 
        // 0 : degree 
        // 1 : degree 
        // 2 : minutes 


        var d= (parts[1]?         parts[1]  : '0.0')*1.0; 
        var m= (parts[2]?         parts[2]  : '0.0')*1.0; 
        var dec= (d + (m/60.0))*neg; 
        return dec; 
    }

I have removed the last part of the regex which captures seconds and fractions of seconds. I have added to the part which captures minutes (?:\.\d+)? This is a non capturing group (?:) - as we don't need it to be captured separate to the integer part of the minutes. It requires a decimal point (\.) and then one or more digits (\d+). The whole group is optional (?) - ie the input can just be integer still.

Edit: Based on your comments I modified it to be a little more white-space-agnostic... It now looks for an integer followed by a space or one of these chars: ".,°d" and that followed by decimal minutes. Solution also posted to your jsfiddle: http://jsfiddle.net/NJDp4/6/

这篇关于正则表达式/Javascript将小数分钟数转换为小数度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆