Vb.net 如何在txt文件中输出一组数字的平均值?
到目前为止我有这个,但它只输出0Vb.net 如何在txt文件中输出一组数字的平均值?,vb.net,Vb.net,到目前为止我有这个,但它只输出0 Option Explicit On Option Strict On Option Infer Off Public Class frmMain Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click Me.Close() End Sub Private Sub btnCalc_Click(sender As
Option Explicit On
Option Strict On
Option Infer Off
Public Class frmMain
Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
Me.Close()
End Sub
Private Sub btnCalc_Click(sender As Object, e As EventArgs) Handles btnCalc.Click
Dim inFile As IO.StreamReader
Dim intBill As Integer
Dim avg As Integer
Dim trueAvg As Integer
If IO.File.Exists("monthlyBills.txt") Then
inFile = IO.File.OpenText("monthlyBills.txt")
Do Until inFile.Peek = -1
Integer.TryParse(inFile.ReadLine, intBill)
avg += intBill
Loop
inFile.Close()
trueAvg = CInt(avg / 12D)
lblAvg.Text = trueAvg.ToString()
Else
MessageBox.Show("Cannot find the file.", "monthlyBills",
MessageBoxButtons.OK, MessageBoxIcon.Information)
lblAvg.Text = "N/A"
End If
End Sub
End Class
以下是“monthlyBills.txt”文本文件:
141.71
156.75
179.25
141.71
130.19
115.05
95.65
86.78
85.45
79.99
98.45
126.78
问题在于,文本文件中的值都不是整数,但您试图将它们解析为整数。您应该使用Decimal
类型
还有一件事,每当使用.TryParse()
方法时,您可能需要检查其返回值以确保解析是否成功。在这种情况下,If
语句会有所帮助
这应该很好:
Dim inFile As IO.StreamReader
Dim intBill As Decimal
Dim avg As Decimal
Dim trueAvg As Integer
If IO.File.Exists(filePath) Then
inFile = IO.File.OpenText(filePath)
Do Until inFile.Peek = -1
If Decimal.TryParse(inFile.ReadLine, intBill) Then
avg += intBill
Else
' TODO: decide what you should do if a line isn't a decimal value.
End If
Loop
inFile.Close()
trueAvg = CInt(avg / 12D)
lblAvg.Text = trueAvg.ToString()
Else
MessageBox.Show("Cannot find the file.", "monthlyBills",
MessageBoxButtons.OK, MessageBoxIcon.Information)
lblAvg.Text = "N/A"
End If
笔记:
- 我将
和inBill
的类型都更改为avg
,但将Decimal
保留为整数,以防需要舍入结束值。如果您没有具体的原因,那么应该使用十进制,并去掉trueAvg
CInt
- NET中的浮点数可以表示为两种不同的类型;二进制表示法(如
或单
类型)和十进制表示法(十进制类型)。对于您的特殊情况,我建议使用双
,因为您似乎在处理价格问题,而Decimal
更合适。你可以阅读更多关于这一差异的文章Decimal
.TryParse
的方法,必须确保文本文件中的每一行都是一个数字
.ReadAllLines
返回一个数组,其中每个元素都是文本文件中的一行
接下来,我们使用一点Linq将每一行(一个字符串)更改为十进制值。.Trim
删除可能存在的任何空白。不要担心IEnumerable
。这就是Linq的回报。它只是意味着你可以用一个循环遍历它
然后我们可以在IEnumerable
上调用.Average
方法,我们就完成了
Private Sub btnCalc_Click(sender As Object, e As EventArgs) Handles btnCalc.Click
Dim lines As String() = File.ReadAllLines("monthlyBills.txt")
Dim decs As IEnumerable(Of Decimal) = From line In lines
Select CDec(line.Trim)
Dim avg As Decimal = decs.Average
lblAvg.Text = avg.ToString("N2")
End Sub
下面是另一个不使用Linq查询而使用.TryParse的示例。如果使用列表而不是数组,则不必事先知道要添加多少项。此外,您不需要跟踪索引。您仍然使用列表中的.Average方法
Private Sub btnCalc_Click(sender As Object, e As EventArgs) Handles btnCalc.Click
Dim lines As String() = File.ReadAllLines("monthlyBills.txt")
Dim decs As New List(Of Decimal)
Dim dec As Decimal
For Each line As String In lines
If Decimal.TryParse(line, dec) Then
decs.Add(dec)
Else
MessageBox.Show(line & " is not a number and is being excluded from calculations.")
End If
Next
Dim avg As Decimal = decs.Average
lblAvg.Text = avg.ToString("N2")
End Sub
(顺便说一句,祝贺:)2个小音符(给OP)<代码>平均值
不是平均值,而是总和。所以,这个名字有误导性12D
不应硬编码,它应表示从文件中读取并实际解析的元素的计数。如答案所示,TryParse
返回一个布尔值,以指示解析是否成功。您的值都不是整数,因此解析总是失败的。当TryParse
返回False
时,输出参数设置为零。这就解释了为什么结果是零。这都在文档中,您可以在调试器中看到这一切。如果您还没有阅读相关文档或调试代码,那么现在就在这里发布还为时过早。对于您试图解决但无法解决的问题也是如此。阅读和调试是尝试的一部分。在第一段代码中,平均值可以是dime=Decimal.Round(lines.average(Function)CDec(s)),2)
@Jimi感谢您的一行代码!我对那些功能的东西还是有点不确定。