对 Len() 函数所得结果不准确的处理
2006-08-13 18:31
197 查看
在文字处理程序的编写中,常会遇到类似于字数统计的问题,我们在 VB/VB.NET 中使用 Len() 函数来进行字符统计,但是我们可以发现一个问题,即当我们在一个允许多行输入的文本框中输入换行符后,Len() 函数所统计出的字符数要大于文本框中的字符数,这本身并不是个错误,只不过当我们输入换行符后,在 VB 中会显示为两个字符,即 Chr(13) 和 Chr(10),这样就使得 Len() 函数所统计出的数字变大了。我们解决这个问题的方法还是有不少的,以下,我用检测 ASCII 码的方式重新统计字符.我们新建一个模块并添加以下过程:
Public Function newLen(Expression, Optional blnMsgBox As Boolean = False) As Long
'//(C) Wei CHEN
'//参数 Expression 表示输入的内容
'//参数 blnMsgBox 表示统计完成后或发生错误时是否显示对话框, False 为不显示, True 为显示
On Error GoTo ErrHandle
Dim numCache As Integer
Dim numCH As Long
Dim numLWord As Long
Dim numUWord As Long
Dim numSymbol As Long
Dim numEnter As Long
Dim numBlank As Long
Dim numNumber As Long
For i = 1 To Len(Expression)
numCache = Asc(Mid$(Expression, i, 1))
'//Chr(10) 和 Chr(13) 可分别表示一个换行符,但如在输入过程中键入 Enter 键,则会
4000
同时输入两个字符
If numCache = 13 Then
If Asc(Mid$(Expression, i + 1, 1)) <> 10 Then numEnter = numEnter + 1
ElseIf numCache = 10 Then
numEnter = numEnter + 1
ElseIf numCache >= 65 And numCache <= 90 Then '//A-Z的 ASCII 码为65-90
numUWord = numUWord + 1
ElseIf numCache >= 97 And numCache <= 122 Then '//a-z的 ASCII 码为97-122
numLWord = numLWord + 1
ElseIf numCache >= 48 And numCache <= 57 Then '//0-9的 ASCII 码为48-57
numNumber = numNumber + 1
ElseIf numCache < 0 Then '//汉字的 ASCII 码为负数
numCH = numCH + 1
ElseIf numCache = 32 Then '//空格的 ASCII 码为32
numBlank = numBlank + 1
Else
numSymbol = numSymbol + 1
End If
Next i
newLen = numEnter + numBlank + numNumber + numLWord + _
numUWord + numCH + numSymbol
If blnMsgBox = True Then
MsgBox "共有字符数(包括换行符和空格): " & newLen & " ,其中包括:" & vbNewLine & _
" " & numEnter & " 个换行符;" & vbNewLine & " " & numBlank & " 个空格;" & _
vbNewLine & " " & numNumber & " 个数字;" & vbNewLine & " " & numLWord & _
" 个小写字母;" & vbNewLine & " " & numUWord & " 个大写字母;" & vbNewLine & _
" " & numCH &<
d1b7
span style="color:rgb(0,0,0);"> " 个汉字;" & vbNewLine & " " & numSymbol & " 个符号。" & vbNewLine & _
"Len() 函数检测到共有字符数: " & Len(Expression) & "个", vbInformation, App.Title
End If
Exit Function
ErrHandle:
newLen = -1 '//发生错误时返回值为-1
If blnMsgBox = True Then
MsgBox "发生以下错误,过程将结束:" & vbNewLine & vbNewLine & " [" & Err.Number & "] " & _
Err.Description, vbApplicationModal + vbCritical, "错误"
End If
End FunctionFunction newLen()
之后,我们新建一个 标准EXE 工程,并在已创建的窗体上绘制一个文本框,命名为 txtString 并将其属性 MultiLine 属性设为 True,再绘制一个按钮,命名为 cmdCheck,并在其 cmdCheck_Click() 过程中添加如下代码:
Private Sub cmdCheck_Click()
newLen txtString.Text, True
End SubSub cmdCheck_Click()
在刚绘制的文本框中输入任意内容,便可以看到我们的函数和 Len() 函数的统计区别,同时也修正了 Len() 函数的不准确性。
Public Function newLen(Expression, Optional blnMsgBox As Boolean = False) As Long
'//(C) Wei CHEN
'//参数 Expression 表示输入的内容
'//参数 blnMsgBox 表示统计完成后或发生错误时是否显示对话框, False 为不显示, True 为显示
On Error GoTo ErrHandle
Dim numCache As Integer
Dim numCH As Long
Dim numLWord As Long
Dim numUWord As Long
Dim numSymbol As Long
Dim numEnter As Long
Dim numBlank As Long
Dim numNumber As Long
For i = 1 To Len(Expression)
numCache = Asc(Mid$(Expression, i, 1))
'//Chr(10) 和 Chr(13) 可分别表示一个换行符,但如在输入过程中键入 Enter 键,则会
4000
同时输入两个字符
If numCache = 13 Then
If Asc(Mid$(Expression, i + 1, 1)) <> 10 Then numEnter = numEnter + 1
ElseIf numCache = 10 Then
numEnter = numEnter + 1
ElseIf numCache >= 65 And numCache <= 90 Then '//A-Z的 ASCII 码为65-90
numUWord = numUWord + 1
ElseIf numCache >= 97 And numCache <= 122 Then '//a-z的 ASCII 码为97-122
numLWord = numLWord + 1
ElseIf numCache >= 48 And numCache <= 57 Then '//0-9的 ASCII 码为48-57
numNumber = numNumber + 1
ElseIf numCache < 0 Then '//汉字的 ASCII 码为负数
numCH = numCH + 1
ElseIf numCache = 32 Then '//空格的 ASCII 码为32
numBlank = numBlank + 1
Else
numSymbol = numSymbol + 1
End If
Next i
newLen = numEnter + numBlank + numNumber + numLWord + _
numUWord + numCH + numSymbol
If blnMsgBox = True Then
MsgBox "共有字符数(包括换行符和空格): " & newLen & " ,其中包括:" & vbNewLine & _
" " & numEnter & " 个换行符;" & vbNewLine & " " & numBlank & " 个空格;" & _
vbNewLine & " " & numNumber & " 个数字;" & vbNewLine & " " & numLWord & _
" 个小写字母;" & vbNewLine & " " & numUWord & " 个大写字母;" & vbNewLine & _
" " & numCH &<
d1b7
span style="color:rgb(0,0,0);"> " 个汉字;" & vbNewLine & " " & numSymbol & " 个符号。" & vbNewLine & _
"Len() 函数检测到共有字符数: " & Len(Expression) & "个", vbInformation, App.Title
End If
Exit Function
ErrHandle:
newLen = -1 '//发生错误时返回值为-1
If blnMsgBox = True Then
MsgBox "发生以下错误,过程将结束:" & vbNewLine & vbNewLine & " [" & Err.Number & "] " & _
Err.Description, vbApplicationModal + vbCritical, "错误"
End If
End FunctionFunction newLen()
之后,我们新建一个 标准EXE 工程,并在已创建的窗体上绘制一个文本框,命名为 txtString 并将其属性 MultiLine 属性设为 True,再绘制一个按钮,命名为 cmdCheck,并在其 cmdCheck_Click() 过程中添加如下代码:
Private Sub cmdCheck_Click()
newLen txtString.Text, True
End SubSub cmdCheck_Click()
在刚绘制的文本框中输入任意内容,便可以看到我们的函数和 Len() 函数的统计区别,同时也修正了 Len() 函数的不准确性。
相关文章推荐
- 【原创】字符串处理函数使用和结果
- 函数处理结果返回给调用函数,实现代码模块化,便于单元测试
- 8.4 stat--stat()函数的结果处理
- flex 多个方法使用一个结果处理函数
- Tapestry5 事件处理函数返回结果处理策略
- 8.4 stat--stat()函数的结果处理
- 给TCL/expect脚本加公共函数处理结果(一)
- 格式化查询+使用伪列level+使用level和lpad()函数对层次化查询结果进行格式化处理
- C语言中函数如何返回处理后的结果?
- flex 多个方法使用一个结果处理函数
- MySQL——数据结果处理函数
- Mysql对检索结果进行处理后返回以及在列上使用函数
- 练习 3-6 修改itoa函数,使得该函数可以接收三个参数。其中,第三个参数为最小字段宽度。为了保证转换后所得的结果至少具有第三个参数指定的最小宽度,在必要时应在所得结果的左边填充一定的空格。
- oracle 函数 输入值,查询数据,返回相应处理结果
- SQL数据库函数如何对多结果进行循环处理
- Tapestry5 事件处理函数返回结果处理策略
- 编写一个程序,要求输入两个浮点数,然后打印出用二者的差值除以二者的乘积所得的结果。在用户非数字的输入之前程序循环处理输入值。
- 信号处理程序中调用不可重入函数getpwnam 起结果是不可预见的。
- genexus中对字符串的格式补空处理(自带函数PadL(s,Len,[c]) )
- (2011.07.08)编程练习_07.08_处理数组和结构的函数.cpp 输出结果有问题。