- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的应用程序允许用户搜索位置,我收到的查询之一是
"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/
我在将 time.Time 转换为 Deciseconds 时遇到问题。我基本上必须将以下内容移植到 Golang Deciseconds 适合 36 位,具有足够的精度来记录用户的同意操作时间。 J
我真的需要帮助。编码结果为2:0:0,格式设置为hh:mm:ss。我希望结果为 2:00:00(当分秒小于 10 时,在分秒前添加 0)。 NSDateFormatter *test = [[NSDa
我是一名优秀的程序员,十分优秀!