【问题标题】:regular expression for latitude and longitude纬度和经度的正则表达式
【发布时间】:2014-11-06 04:14:07
【问题描述】:

我想要检查有效lat/long for india only的正则表达式。经度范围是70-98,小数点后一位,纬度范围是8-36,小数点后一位

我已经在 android 中实现了这个。我编写的这段代码分别针对纬度和沿途的 -90 到 90 和 -180 到 180 的范围,它正在工作,但现在我的经度和经度范围已更改。

对于小数点,它应该允许 8.0 到 36.0。

public class Manual_LatLong extends Activity

{

private EditText LAT1;

private EditText LONGITUDE1;

private static final String TAG_LAT = "LAT";

private static final String TAG_LONG = "LONGITUDE";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_manual__lat_long);

    LAT1 = (EditText) findViewById(R.id.editText1);
    LONGITUDE1 = (EditText) findViewById(R.id.editText2);

    findViewById(R.id.show).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {

             String LAT = LAT1.getText().toString();
            if (!isValidLAT(LAT)) {
                LAT1.setError("Invalid Latitude");
                LAT1.requestFocus(LAT.length());

            }
            else{

                 String LONGITUDE = LONGITUDE1.getText().toString();
                 if (!isValidLONG(LONGITUDE)) {
                    LONGITUDE1.setError("Invalid LONGITUDE");
                    LONGITUDE1.requestFocus(LONGITUDE.length());
                }
                 else{
                    Intent in = new Intent(getApplicationContext(), LocationActivity.class);
                    // Sending lat/long to next activity
                    in.putExtra(TAG_LAT, LAT);
                    in.putExtra(TAG_LONG, LONGITUDE);
                    startActivityForResult(in, 100);
                 }

             }


        }
    });
}

private boolean isValidLAT(String LAT) {
    String LAT_PATTERN = "(-?[0-8]?[0-9](\\.\\d*)?)|-?90(\\.[0]*)?";

    Pattern pattern = Pattern.compile(LAT_PATTERN);
    Matcher matcher = pattern.matcher(LAT);
    return matcher.matches();
}


private boolean isValidLONG(String LONGITUDE) {
    String LONG_PATTERN = "(-?([1]?[0-7][1-9]|[1-9]?[0-9])?(\\.\\d*)?)|-?180(\\.[0]*)?";

    Pattern pattern = Pattern.compile(LONG_PATTERN);
    Matcher matcher = pattern.matcher(LONGITUDE);
    return matcher.matches();

}

}

【问题讨论】:

  • 对于纬度我试过这个:PATTERN = "(?[7-9]?[0-8](\\.\\d*)?)" 但它显示我语法错误.
  • 你是如何使用这个变量的,用什么语言,错误信息是什么?请更新您的问题。
  • 如果这是 shell 脚本,等号周围不能有空格,而且许多标准正则表达式工具(grep 等)不支持像 \d 这样的 Perl 扩展。
  • (那不妨修正题名中“纬度”的拼写。)
  • “小数点后一位”是指最后一个范围以 36.0 结尾吗?所以 35.9 可以,但 36.1 不行吗?还是您的意思是到 36.9 为止?

标签: java android regex range decimal


【解决方案1】:

我认为这将是使用 Regex 最糟糕的事情之一。你不能把它转换成双精度吗?

double latitude = Double.parseDouble(R.id.editText1.getText().toString());
double longitude = Double.parseDouble(R.id.editText2.getText().toString();

并使用 if (latitude

编辑:

如果最多只能保留一位小数:

String latitude_s = R.id.editText1.getText().toString();
String longitude_s = R.id.editText2.getText().toString();

如果它有小数点,则首先检查每个字符串是否只有一个小数点。 (查看here如何检查小数位)

之后,您可以继续比较双打。

【讨论】:

  • 谢谢你的回复,但是这样我怎么能得到一个小数点的纬度和经度。
  • 你是说你的经纬度只能是小数点后一位吗?意思是 8.1 是有效的纬度,但 8.12 不是?
  • 为什么更精确的坐标无效?
猜你喜欢
  • 2011-07-24
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多