Microsoft Report Builder十进制转HH:MM格式报错求助
问题分析与解决
先明确你写的表达式报错的核心原因:
- 第一个表达式存在逻辑错误:你写的
Fields!Time_Used.Value - Floor(Fields!Time_Used.Value) * 60会先执行乘法再减法,比如假设Time_Used是对应14:40的十进制值14.666,Floor(14.666)是14,14*60=840,14.666-840会得到负数,CInt转换这类数值必然报错。正确逻辑应该是先提取小数部分再乘60,也就是(Fields!Time_Used.Value - Floor(Fields!Time_Used.Value)) * 60。 - 第二个表达式
Fields!Time_Used.Value * 60如果Time_Used是字符串类型(比如显示的"0:24"是字符串),直接做乘法会因类型不兼容报错;就算是数值类型,也只能得到总分钟数,不是你要的HH:MM格式。
下面分两种常见场景给出解决办法:
场景1:Time_Used是十进制小时数(比如14.666对应14:40)
用以下表达式可直接转成带补零的HH:MM格式:
= Format(TimeSerial(Floor(Fields!Time_Used.Value), CInt((Fields!Time_Used.Value - Floor(Fields!Time_Used.Value)) * 60), 0), "HH:mm")
或者用字符串拼接的方式:
= Format(Floor(Fields!Time_Used.Value), "00") & ":" & Format(CInt((Fields!Time_Used.Value - Floor(Fields!Time_Used.Value)) * 60), "00")
场景2:Time_Used是字符串格式(比如存储为"0:24")
如果Time_Used是字符串类型,需要先转成数值再计算。比如要将"小时:分钟"格式的字符串转成标准HH:MM:
Dim parts() As String = Split(Fields!Time_Used.Value, ":") Dim totalMinutes As Integer = CInt(parts(0)) * 60 + CInt(parts(1)) = Format(TimeSerial(totalMinutes \ 60, totalMinutes Mod 60, 0), "HH:mm")
注:如果你的示例"0:24"要转成14:40,说明Time_Used的单位不是小时/分钟,可能是天或其他,需要先确认单位调整转换系数,比如单位是天的话,就用totalMinutes = CDbl(Fields!Time_Used.Value) * 24 * 60再转格式。
内容的提问来源于stack exchange,提问作者andres_immortal
相关产品推荐
相关产品推荐

