Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vb.net从字符串转换错误_Vb.net - Fatal编程技术网

vb.net从字符串转换错误

vb.net从字符串转换错误,vb.net,Vb.net,在我的VB应用程序中,我收到以下错误消息: 从字符串“Inv,1234,10/09/2015,Integra,1234”转换为类型“Double”无效 代码行是: sage_string = "Inv," + customer_accountnumber + "," + InvoiceDate.Text + "," + _ customer_company_name + "," + invoice_number + "," + "4001," + "VoIP Call Charges,"

在我的VB应用程序中,我收到以下错误消息:

从字符串“Inv,1234,10/09/2015,Integra,1234”转换为类型“Double”无效

代码行是:

sage_string = "Inv," + customer_accountnumber + "," + InvoiceDate.Text + "," + _
    customer_company_name + "," + invoice_number + "," + "4001," + "VoIP Call Charges," + _
    Val(actual_detail_amount.ToString("F2")) + "," + "Standard," + _
    Val(actual_detail_amount * (vat_percentage / 100).ToString("F2")) + "," + _
    Val(actual_detail_amount + (actual_detail_amount * (vat_percentage / 100) _
    ).ToString("F2")) + ", , , ,"
实际详细金额
增值税百分比
都是我计算的数字


我做错了什么?

当您在字符串和数字之间使用
+
运算符时,VB尝试将字符串转换为与数字相同的类型

改用
运算符,确保两个操作数都是字符串:

sage_string = _
  "Inv," & customer_accountnumber & "," & InvoiceDate.Text & "," & _
  customer_company_name & "," & invoice_number & "," & "4001," & _
  "VoIP Call Charges," & Val(actual_detail_amount.ToString("F2")) & "," & _
  "Standard," & Val(actual_detail_amount * (vat_percentage / 100).ToString("F2")) & "," & _
  Val(actual_detail_amount + (actual_detail_amount * (vat_percentage / 100)).ToString("F2")) & _
  ", , , ,"

我现在通过使用来自Guffa的解决方案来实现这一点,同时删除值周围的
Val()
,以及数字末尾的
.ToString(“F2”)
+
操作符是算术加法。使用
进行字符串连接

但是,使用
String.Format
将使整个表达式更易于编写和读取:

actual_detail_amount = Math.Round(actual_detail_amount, 2)
Dim vat = Math.Round(actual_detail_amount * (vat_percentage / 100), 2)
Dim total = actual_detail_amount + vat

sage_string = _
  String.Format("Inv,{0},{1},{2},{3},4001,VoIP Call Charges,{4},Standard,{5},{6}, , , ,", _
    customer_accountnumber, InvoiceDate.Text, customer_company_name, invoice_number,
    actual_detail_amount, vat, total)
使用
Val(x.ToString(“F2”))
进行舍入也不是一个好的解决方案。改用
Math.Round(x,2)
。它正是为了这个目的而制作的

将计算分配给局部变量使其更易于阅读


还有一件事:使用
Decimal
类型进行货币计算,而不是
Double
Double
在内部使用二进制表示。这会给分数带来额外的舍入误差<例如,code>0.1
不能用二进制形式表示为有限分数,就像十进制形式的
1/7
一样。

使用
&
而不是
+
选项严格设置为
使用它,它可以是你最好的朋友,直到最后。我的错误是现在说“从字符串“F2”转换”键入“Integer”无效。“@charlie这是因为上述代码中存在问题。复制粘贴不起作用。其中一个
+
运算符被不正确地替换为
&
。它不允许我更改它,更改太小。@Thomas:我可以更改它。感谢您发现它。您是否更改了等式中的
&
运算符?如果没有,您将得到一些有效的结果,但它可能不正确。
Val
调用没有任何作用,但是
.ToString(“F2”)
调用似乎旨在限制计算中的小数数。您可能需要使用
Math.Round(…,2)
来限制小数,或者如果需要特定格式,可以对整个数值使用
.ToString(“F2”)