2010-07-06 46 views
3

我正在嘗試對從Google Maps API傳回的latlng對象執行validates_format_of。我已經完成了地圖的設置,當我點擊地圖上的一個點時,它會用latlng填充文本字段(如下所示:46.320615137905904,9.400520324707031)。我將這個值作爲一個字符串存儲在數據庫中(然後我解析出將標記放置在地圖上),但我需要使用兩個浮點數(正數或負數)來驗證兩個浮點數的格式。谷歌地圖驗證的Rails正則表達式經緯度

我知道這是可能的正則表達式,但對於我的生活還沒有能夠找出正則表達式字符串來得到它的工作。

任何幫助將超級讚賞!謝謝! 傑夫

回答

8

/^-?\d+\.\d+\,\s?-?\d+\.\d+$/

  • ^匹配的
  • $開始時的字符串的末尾匹配
  • -?一個可選的減號匹配
  • \d+匹配1個或多個數字
  • \.符合項目一個點(你必須逃避它,因爲.匹配任何字符)
  • \s?相匹配的可選空白

您可能需要在開始或結束時接受空格:

/^\s*-?\d+\.\d+\,\s?-?\d+\.\d+\s*$/

+0

經過測試和着作http://rubular.com/r/efAZkpiNMl。 @Leventix:'/^\ s * [ - +]?\ d + \。\ d + \,\ s?[ - +]?\ d + \。\ d + \ s * $ /'允許+和 - 。酷解決方案btw。 :) – 2010-07-06 08:52:15

+2

另一個建議:'/^\ s * [ - +]?\ d {1,3} \。\ d + \,\ s?[ - +]?\ d {1,3} \。\ d + \ s * $ /' - 因爲經緯度應該在0到180之間。 – Chowlett 2010-07-06 09:49:25

+0

乾杯!並感謝您的解釋 - 這將有助於我稍後再問! – erskingardner 2010-07-06 13:18:13

6

它是可能的正則表達式,但您可能會發現更容易如下

latitude, longitude = latlong.split(',') 

再檢查兩個變量的numericality使用分裂。

+1

我喜歡這個解決方案,因爲它也適合於範圍檢查的值(應該是180 -180之間)。 – Chowlett 2010-07-06 09:50:07

+2

@Chris -180到+180對經度有好處,緯度是-90到+90 – 2010-07-06 10:04:10

9

我驗證這種方式:

var ck_lat = /^-?([1-8]?\d(?:\.\d{1,})?|90(?:\.0{1,6})?)$/; 
var ck_lon = /^-?((?:1[0-7]|[1-9])?\d(?:\.\d{1,})?|180(?:\.0{1,})?)$/; 
var lat = 89.320615; 
var lon = 179.400520; 

if(ck_lat.test(lat) && ck_lon.test(lon)) { 
    //Was a valid latitude and longitude pair :) 
} 

這是在開發階段,但它工作正常,這裏是測試鏈接正則表達式:

檢查緯度:http://rubular.com/r/vodC5TW3lG

檢查經度:http://rubular.com/r/3LIIcjFEQT

編輯: 感謝蒂姆·凱利的改善,這一個捕捉-90/-180,我覺得現在是完全:) 編輯的鏈接和代碼。

+1

FWIW,你的解決方案捕獲得最多,但不會分別達到-90或-180 ......但真的很接近! :)只要移動「 - ?」在第一個括號之外如此:「/^-?([1-8]?\d(?:\.\d{1,})?|90(?:\.0{1,6})?) $(「),以及:」/^- ?((?: 1 [0-7] | [1-9])?\ d(?:\。\ d {1,})?| 180 ?:\。0 {1,})?)$ /「爲經度。乾杯! – 2015-07-10 20:21:52

1

緯度範圍從-90到90 經度範圍從-180到我已經使用一個正則表達式,其評估值,其具有4-6個小數點(範圍介於因爲在谷歌地圖API大多6 180

小數點精度時)

緯度/^(-?(90\.0{4,6})|([0-8]\d{0,1})\.\d{4,6})$/

http://rubular.com/r/UpY74Y4fuG

經度:/^(-?((180)\.0{4,6})|((1[0-7][0-9])|([0-9]\d{0,1}))\.\d{4,6})$/

http://rubular.com/r/OQ0KS7puhv