【问题标题】:How to validate geographic coordinates?如何验证地理坐标?
【发布时间】:2018-11-28 23:34:25
【问题描述】:

我正在尝试验证 JTextField 的文本。此文本字段的内容应类似于 66.160507, -153.36914166.160507,-153.369141(逗号后没有空格)。 到目前为止,我只验证纬度和经度的范围。 这里:

 String [] splitted = jtextField.getText().split(",");
 double latitude = Double.parseDouble(splitted[0]);
 double longitude = Double.parseDouble(splitted[1])

if(latitude < -90 || latitude > 90)
  return false;
else
  continue;

if(longitude < -180 || longitude > 180)
      return false;
    else
      continue;

但是现在我如何检查JTextField 中的文本格式和顺序是否正确?我需要验证这两种情况:

must be a double -> must be a comma -> must be a whitespace -> must be a double 
must be a double -> must be a comma -> must be a double 

【问题讨论】:

  • 不是你问的,但你想要||(意思是“或”)而不是and在你的两个if条件。而且你不需要else continue;
  • 使用JFormattedTextField 限制输入类型(即仅限十进制值),您仍然需要验证范围
  • @MadProgrammer 听起来像是一个答案。
  • @MadProgrammer,谢谢,不过我仍然需要检查一切是否按正确的顺序进行。
  • @JaneLilep 我将为latitudelongitude 设置一个单独的字段,JFormattedText 字段的作用是确保用户只输入数字数据

标签: java swing validation gps coordinates


【解决方案1】:

一种选择是使用正则表达式来验证文本字段中内容的形式。您可以在 the Javadoc for the Pattern class 阅读可以在正则表达式中使用的不同符号,但您可能会使用一些符号

  • * 之前的任意数量的匹配项(包括无);
  • + 一个或多个匹配之前的内容;
  • ? 零个或一个匹配之前的内容;
  • [ ] 一系列字符。
  • \. 一个点(如果反斜杠在 Java String 文字中,则需要转义),
  • \s 任何空格(这个反斜杠也需要在 String 文字中转义)。

把所有这些放在一起,你可能会想出一个像这样的正则表达式。

-?[1-9][0-9]*(\.[0-9]+)?,\s*-?[1-9][0-9]*(\.[0-9]+)?

匹配一对纬度和经度。

这匹配

  • 可选的减号,
  • 第一个数字不是 0 的数字,
  • 任何数量的其他数字(甚至没有),
  • (可选)一个由小数点组成的序列,然后是任意数量的其他数字,
  • 一个逗号,
  • 任意数量的空白字符(甚至没有),
  • 本段的前四个要点,从头再来。

然后你可以编写这样的代码。

String textValue = jtextField.getText();
String twoDoublesRegularExpression = "-?[1-9][0-9]*(\\.[0-9]+)?,\\s*-?[1-9][0-9]*(\\.[0-9]+)?";

if (textValue.matches(twoDoublesRegularExpression)) {
    // this value is OK
}

【讨论】:

  • 非常感谢,但是这个正则表达式在不应该的情况下使用以下输入“43,90321”。它也适用于此“13.90,12.91”,但不适用于此“13.90, 12.91”(逗号后的空格)。
  • 所以你可能需要一些调整。我认为43,90231 将在您的范围检查中被捕获,因为 90231 不在 -180 和 180 之间。正则表达式仅检查您是否有两个用逗号分隔的数字。如果你想让空格成为可能,那么你可以在正则表达式的正确位置放置一个空格和一个*
  • 我已经编辑了答案以允许输入中的任意数量的空格。我误读了您所说的“逗号后没有空格”的问题。
  • 再次,非常感谢!我必须学习正则表达式,因为我从未使用过它们。我可以再问你一件事吗?我不知道我是否应该问一个新问题......无论如何,这个正则表达式 ([+-]?\d+\.?\d+)\s*,\s*([+-]?\d+\.?\d+) 和你的有什么区别?例如,您的接受输入“3,3”,但另一个不接受。
  • 嗯,有一些区别;但我认为关键是你的表达式有\d+\.?\d+ 用于数字部分。现在\d 只是[0-9] 的简写;但+ 表示“一个或多个”。所以这是一个或多个数字,然后是一个点,然后是一个或多个数字。因此,即使没有点,也必须至少有两位数字才能匹配这个正则表达式。这就是为什么 3 在您的示例中不匹配的原因。
猜你喜欢
  • 1970-01-01
  • 2018-01-26
  • 2016-12-05
  • 2021-11-23
  • 2021-03-17
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多