gpt4 book ai didi

java - 如何将以字符串表示的度分秒位置转换为 double

转载 作者:行者123 更新时间:2023-11-30 10:42:24 26 4
gpt4 key购买 nike

我的应用程序允许用户搜索位置,我收到的查询之一是

"78°14'09"N 15°29'29"E"

显然用户想要去这个位置。首先,如何检查该字符串是否正确符合十进制格式。那么如何将其转换为 double 格式呢?

double latitude = convertToDouble("78°14'09"N")

我在 stackoverflow 上搜索过,但他们都在寻找相反的内容: double 到十进制。

最佳答案

78°14'09"N 15°29'29"E

First how do I check if this string fits the decimal format correctly. Then how do I convert it to double format?

该字符串不是采用十进制(度)格式。它以度、分和秒为单位,这或多或少与十进制格式相反。因此,我将您的意思解释为您想要测试该字符串是否采用有效的 D/M/S 格式,如果是,则将其转换为十进制,表示为一对 double s。

这主要是一个解析问题,正则表达式对于像这样的简单解析问题通常很有用。合适的正则表达式既可以检查格式,又可以捕获需要提取的数字部分。这是创建此类模式的一种方法:

    private final static Pattern DMS_PATTERN = Pattern.compile(
"(-?)([0-9]{1,2})°([0-5]?[0-9])'([0-5]?[0-9])\"([NS])\\s*" +
"(-?)([0-1]?[0-9]{1,2})°([0-5]?[0-9])'([0-5]?[0-9])\"([EW])");

我承认,这有点密集。如果您不熟悉正则表达式,那么这里没有完整的解释; API docs for Pattern提供概述,您可以在很多地方找到教程。如果您发现您的输入与此模式匹配,那么您不仅验证了格式,而且还解析出了正确的部分以转换为十进制。

基本公式为decimal = degrees + minutes / 60 + seconds / 3600 。您还有一个额外的复杂问题,即坐标从赤道/本初子午线的方向可以通过 N/S、E/W 或带符号的 N、E 或两者的组合来表示。上述模式适用于所有这些替代方案。

把它们放在一起,你可能会这样做:

    private double toDouble(Matcher m, int offset) {
int sign = "".equals(m.group(1 + offset)) ? 1 : -1;
double degrees = Double.parseDouble(m.group(2 + offset));
double minutes = Double.parseDouble(m.group(3 + offset));
double seconds = Double.parseDouble(m.group(4 + offset));
int direction = "NE".contains(m.group(5 + offset)) ? 1 : -1;

return sign * direction * (degrees + minutes / 60 + seconds / 3600);
}

public double[] convert(String dms) {
Matcher m = DMS_PATTERN.matcher(dms.trim());

if (m.matches()) {
double latitude = toDouble(m, 0);
double longitude = toDouble(m, 5);

if ((Math.abs(latitude) > 90) || (Math.abs(longitude) > 180)) {
throw new NumberFormatException("Invalid latitude or longitude");
}

return new double[] { latitude, longitude };
} else {
throw new NumberFormatException(
"Malformed degrees/minutes/seconds/direction coordinates");
}
}

convert()方法是主要的;它将坐标作为两个 double 的数组返回s,表示赤道与本初子午线交点以北和以东的坐标(以十进制表示)。赤道以南的纬度表示为负,本初子午线以西的经度也是如此。一个NumberFormatException如果输入与模式不匹配,或者明显表示的纬度或经度无效(经度的大小不能超过 180°;纬度的大小不能超过 90°),则会抛出该异常。

关于java - 如何将以字符串表示的度分秒位置转换为 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38151856/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com