Foxtable(狐表)用户栏目专家坐堂 → 完整的数据转换文档


  共有27161人关注过本帖树形打印复制链接

主题:完整的数据转换文档

帅哥哟,离线,有人找我吗?
狐狸爸爸
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
可否实现在线EXCEL功能,不让EXCEL到外飞  发帖心情 Post By:2009/3/13 15:13:00 [只看该作者]

数据转换函数


在程序开发的过程中,我们经常需要将某一类型的数据转换为其它数据类型后使用。
为此Visual Basic提供了以下转换函数:

  • CStr
    转换为字符串(String)。
     
  • CDate
    转换为日期(Date)。
     
  • CDbl
    转换为双精度小数(Double)。
     
  • CInt
    转换为整数(Integer)。
     
  • CLng
    转换为长整数(Long)。
     
  • CSng
    转换为单精度小数(Single)。
     
  • CDec
    转换为高精度小数(Decimal)。
     
  • Cbyte
    转换为微整数(Byte)。
     
  • CShort
    换为短整数(Short)。

示例

Dim s As String = "123.12"
Output.Show(Cdate(
"1999-12-31"))
Output.Show(CInt(s))
Output.Show(CDbl(s) +
100
)

 


[本帖被加为精华]
 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2009/3/13 15:13:00 [只看该作者]

带判断的转换


显然任何类型的数据,都可以转换为字符型。
但是对于其它类型的数据,却有转换失败的可能,例如:


Dim
s As String = "abc"
Dim
v As Long = 123
Return
CLng(s) +
v


如果在命令窗口执行上面的代码,会出现错误提示:字符串"abc"无法转转位长整数。
为了解决这个问题,我们可以采用另一种转换方法。

除了String(字符)类型外,所有的基本数据类型,都有一个TryParse方法,用于将其它类型的数据转换为本类型的数据。


语法


Type
.TryParse(Value,Variant)


说明

Type:   目标数据类型,例如Date、Integer、Long、Double等等。
Value:  要进行转换的数据。
V
ariant: 用于存放转换结果的变量,变量的类型必须和Type指定的类型一致。

如果转换成功,则将转换结果存储在变量Variant中,并返回True,否则返回False。


例如:


Dim
s As string = "123.1"
Dim
d As Double
Double
.TryParse(s, d) '将变量s的内容转换为数值,并存放在变量d中
Output.Show(d +
100)
'输出结果是223.1

再例如:

Dim d As Date '变量d用于存储转换结果
If
Date.TryParse("1999/12/31", d) Then '如果转换成功
    Output.Show(d)
'输出转换结果
Else

    Output.Show(
"无效日期格式") '给出错误提示
End
If


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2009/3/13 15:13:00 [只看该作者]

最直接的转换


前面已经讲到,使用转换函数转换数据类型,在转换失败的情况下,会出现错误提示。
使用TryParse方法,可以避免错误提示,但是代码略显繁琐。

Visual Basic提供了一个Val函数,用于将字符转换为数值,即使转换失败,也不会报错,而是返回0。


例如:


Dim
s1 As String = "abc"
Dim
s2 As String = "123.12"
Output.Show(Val(s1) +
100) '等于100
Output.Show(Val(s2) +
100)
'等于232.12


虽然变量s1是无法转换为数值的,但是在命令窗口执行上面的代码,却不会有任何错误提示,因为Val函数将s1被转换为0了。


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2009/3/13 15:21:00 [只看该作者]

日期列的一个意外


大多数时候,我们可以直接使用日期列的值。
例如假定当前表有一个日期列,可以在名称窗口正常执行下面的代码:


Dim
m As Integer = CurrentTable.Current("日期").Month
Dim
d As Date = CurrentTable.Current("日期").AddYears(360)


但是如果你在命令窗口执行下面的代码,却会出现错误提示:


Dim
t As TimeSpan
t =
Date.Today - CurrentTable.Current("日期")
OutPut.Show(
"距今天数:" & t.TotalDays)


要使上面的代码正确执行,可以修改为:


Dim
t As TimeSpan
t =
Date.Today - CDate(CurrentTable.Current("日期"))
OutPut.Show(
"距今天数:"
& t.TotalDays)


上面的代码用CDate将列中的值转换为日期,你也许会奇怪,本来就是日期,何来转换之说,这是因为我们从某列取值的时候,不管列类型如何,得到的始终是一个Object类型的值,但是Visual Basic会自动判断真实的值类型,所以我们直接使用即可。唯一的例外就是上面这个例子:日期之间相减的时候,用CDate函数明确地转换一下。


除了用CDdate转换外,还可以:


Dim
t As TimeSpan
Dim
d As Date = CDate(CurrentTable.Current("日期"))
t =
Date.Today - d
OutPut.Show(
"距今天数:"
& t.TotalDays)


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2009/3/13 15:23:00 [只看该作者]

变量的作用范围


在代码的任何位置,我们都可以用Dim语句定义变量,但是不同位置定义的变量,其作用范围是不同的。
变量的作用范围原理如下:如果在流程语句之内定义的,则只在该流程语句之内以及嵌套的字流程语句内有效,如果在流程语句之外定义的,则在该段代码的任何位置有效。

为说明上述原理,我们哟内一些例子说明,这些代码本身没有意义,甚至显得非常冗余,但是可以很好地说明问题:


示例一


下面的代码能够正常执行:


Dim
m As Integer 'm在流程语句之外,在任何位置可以使用
If
m > 0 Then
    Dim
n As integer 'n在流程语句之内定义,只能在本流程内使用
    n =
1 '使用n
    m = n +
1 '使用m和n
End If

m = m *
2
'使用m


示例二


下面的会报错,问题出在最后一行代码,因为变量n是在If语句内定义的,不能在If语句之外使用:


Dim
m As Integer 'm在流程语句之外,在任何位置可以使用
If
m > 0 Then
    Dim
n As integer 'n在流程语句之内定义,只能在本流程内使用
    n =
1 '使用n
    m = n +
1 '使用m和n
End If

m = m *
2 '使用m
n = n *
2 '这会导致代码出错,因为变量n不能在流程外使用


示例三


不同的流程语句内,可以定义同名的变量,例如在下面的代码中,我们在四个地方定义了名称为n的变量:


Dim
m As Integer = 5
If
m > 0 Then
    Dim
n As Integer
    n =
1
Else
    Dim
n As Integer
    n =
10
End
If
Select Case
m
    Case
1,3,5,7,8
       
Dim n As Integer = 1
        m = n

    Case
2,4,6,8,10
       
Dim n As Integer = 1
        m =
2
End Select

Messagebox.Show(IIF(m =
1,"奇数","偶数"
))

实际使用的时候,如果某一个变量需要在不同的流程中使用,应该直接在流程外定义,如果某个变量只在流程内使用,那么就应该在该流程内定义。


示例四


在流程语句之内定义的变量,可以在子流程内使用,例如下面的代码中,变量n是在If语句中定义的,在嵌套的子流程Select Case语句中也使用了该变量:

Dim m As Integer = 1
If
m > 0 Then
    Dim
n As Integer
    n =
1
   
Select Case m
       
Case 1,3,5,7,8
            n =
1
       
Case 2,4,6,8,10
            n =
2
   
End Select
    Messagebox.Show(IIF(n =
1,"奇数","偶数"))
End If


示例五


流程内和流程外,不能有同名的变量,例如下面的代码会出现错误,这是因为变量n同时在流程内和流程外定义了:

Dim m As integer
Dim
n As Integer
If
n > 0 Then
    Dim n As integer
    m =
1
End If


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2009/3/13 15:24:00 [只看该作者]

再谈空值


我们前面已经提到过,空值用Nothing表示。例如需要删除订单表某行客户列的内容,可以:


Tables(
"订单").Rows(1)("客户") = Nothing



DataTables(
"订单").DataRows(1)("客户") = Nothing


如果要判断某一列的内容为空,可以:


If Tables(
"订单").Rows(1).IsNull("客户") Then
 
'代码
End If



If DataTables(
"订单").DataRows(1).IsNull("客户") Then
  '代码

End If


你也许会感到奇怪,为什么要用IsNull判断,而不能用下面的方法判断呢:


If Tables(
"订单").Rows(1)("客户") Is Nothing Then
  '代码

End If


这是因为即使某列的值为空,其返回的值也不会是Nothing。
在某列内容为空的时候,会根据不同的列类型,返回不同的值,规则如下:


字符列:""
数值列:0
逻辑列:False
日期列:#0001-01-01 0:00:00#


 回到顶部
帅哥哟,离线,有人找我吗?
i52117
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:374 积分:3147 威望:0 精华:0 注册:2009/2/3 9:55:00
  发帖心情 Post By:2009/3/13 15:27:00 [只看该作者]

谢谢狐狸爸爸

 回到顶部
帅哥哟,离线,有人找我吗?
kylin
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 F6
等级:狐精 帖子:3036 积分:19229 威望:0 精华:2 注册:2008/9/1 7:50:00
  发帖心情 Post By:2009/3/13 16:38:00 [只看该作者]

收到


 回到顶部
帅哥哟,离线,有人找我吗?
菜鸟foxtable
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 菜鸟中的老鸟
等级:七尾狐 帖子:1486 积分:10064 威望:0 精华:9 注册:2008/11/14 8:54:00
  发帖心情 Post By:2009/3/14 8:42:00 [只看该作者]

收藏

 回到顶部
帅哥哟,离线,有人找我吗?
林中侠
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 德凯软件工作室
等级:幼狐 帖子:166 积分:1435 威望:0 精华:0 注册:2008/9/4 14:26:00
  发帖心情 Post By:2009/3/14 8:45:00 [只看该作者]

写入帮助中


 回到顶部
总数 11 1 2 下一页