-1

双坐标X = Convert.ToDouble(((((-1.2170 - (Convert.ToDouble(labelLonR.Text))) * -1) * (638 / 0.0548))));

输入格式不正确的字符串?我不知道怎么做,我已经把它全部转换成双倍了!

任何帮助表示赞赏。

4

5 回答 5

4

这可能是您的文化设置的问题。

示例:“123.12”在我当前的文化设置中不是有效的双精度,但“123,12”是。

解决方案:

Convert.ToDouble("123.12", System.Globalization.CultureInfo.InvariantCulture);

当您不确定文本的格式时,请使用CultureInfo.InvariantCulture 。引用msdn:

不变的文化是文化不敏感的;它与英语相关,但与任何国家/地区无关。您可以在对 CultureInfo 实例化方法的调用中使用空字符串 ("") 按名称指定不变区域性。CultureInfo.InvariantCulture 还检索不变区域性的一个实例。它几乎可以用在 System.Globalization 命名空间中需要文化的任何方法中。CompareInfo、DateTimeFormat 和 NumberFormat 等属性返回的对象也反映了字符串比较和不变区域性的格式约定。

与文化敏感数据不同,文化敏感数据会因用户自定义或 .NET Framework 或操作系统的更新而发生变化,不变的文化数据随着时间的推移和已安装的文化是稳定的,并且不能由用户自定义。这使得不变区域性对于需要与区域性无关的结果的操作特别有用,例如保留格式化数据的格式化和解析操作,或要求数据以固定顺序显示而与区域性无关的排序和排序操作。

另一方面,您可以删除外部 Convert.ToDouble 的一些括号,并使结果分配更好

double CoordinatesX = (1.2170 + Convert.ToDouble(labelLonR.Text)) * 638 / 0.0548

编辑:正如其他人指出的那样,对您的财产进行验证是个好主意,特别是如果它是来自用户的输入。

于 2012-12-04T17:56:43.737 回答
0

尝试

double value = 0;
double.TryParse(labelLonR.Text, out value);
double CoordinatesX = Convert.ToDouble(((((-1.2170 - value ) * -1) * (638 / 0.0548))));
于 2012-12-04T18:00:59.370 回答
0

LINQPad

string value = "50.339";
double CoordinatesX = Convert.ToDouble(((((-1.2170 - (Convert.ToDouble(value))) * -1) * (638 / 0.0548))));

CoordinatesX.Dump();

返回 600232.262773723

我建议您在 labelLonR.Text 中没有“50.339”。null 返回 14168.7226277372,所以我将使用非数字值。您应该更喜欢将 Convert.ToDouble() 与重载 IFormatProvider 一起使用。虽然您的会计师可能会隐含地理解 (50.339) 是负数,但 CLS 不会。

于 2012-12-04T18:07:03.060 回答
0

labelLonR.Text 可能为 null,因此无法转换为 double。

使用Double.TryParse方法将您的字符串转换为双精度,并返回转换成功或失败。

选中后,继续进行变量初始化。

于 2012-12-04T18:00:03.717 回答
0

试试这个代码。如果它抛出这个异常,你就会知道问题是什么......

double lonR;
double CoordinatesX;
if (double.TryParse(labelLonR.Text, out lonR))
    CoordinatesX = ((-1.2170 - lonR) * -1) * (638 / 0.0548);
else
    throw new Exception("The lonR format is Incorrect!");

我更喜欢使用 TryParse 而不是 Convert。

于 2012-12-04T18:06:14.170 回答