双坐标X = Convert.ToDouble(((((-1.2170 - (Convert.ToDouble(labelLonR.Text))) * -1) * (638 / 0.0548))));
输入格式不正确的字符串?我不知道怎么做,我已经把它全部转换成双倍了!
任何帮助表示赞赏。
这可能是您的文化设置的问题。
示例:“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
编辑:正如其他人指出的那样,对您的财产进行验证是个好主意,特别是如果它是来自用户的输入。
尝试
double value = 0;
double.TryParse(labelLonR.Text, out value);
double CoordinatesX = Convert.ToDouble(((((-1.2170 - value ) * -1) * (638 / 0.0548))));
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 不会。
labelLonR.Text 可能为 null,因此无法转换为 double。
使用Double.TryParse方法将您的字符串转换为双精度,并返回转换成功或失败。
选中后,继续进行变量初始化。
试试这个代码。如果它抛出这个异常,你就会知道问题是什么......
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。