我正在尝试使用如下所示的公共函数添加序数日期
Public Function AddOrdinal(ByVal num As Integer) As String
Dim ordinaldate As String
Select Case (num Mod 100)
Case 11 To 13
Return num.ToString() & "th"
End Select
Select Case num Mod 10
Case 1
Return num.ToString() & "st"
Case 2
Return num.ToString() & "nd"
Case 3
Return num.ToString() & "rd"
Case Else
Return num.ToString() & "th"
End Select
ordinaldate = Format(Date.Today, "dd") & AddOrdinal() & Format(Date.Today, "MMMM YYYY")
End Function
但是我收到错误消息:
未为“公共函数AddOrdinal(num作为Interger)作为字符串”的参数“ num”指定参数。
我很困惑,因为已经指定了num,但是我必须缺少一些东西。
任何帮助将不胜感激。
谢谢
答案 0 :(得分:1)
在引用AddOrdinal()
时,在以下语句中,它认为您正在尝试递归调用该方法:
ordinaldate = Format(Date.Today, "dd") & AddOrdinal() & Format(Date.Today, "MMMM YYYY")
由于您没有传递任何参数,并且它需要num As Integer
参数,因此会给您带来编译错误。
在旧版本的VB中,在添加Return
语句之前,以这种方式引用返回值并不罕见(尽管从不建议这样做,因为如果不这样做,它可能会意外导致意外的递归)小心)。但是,在VB.NET中,当您使用Return
语句返回值时,它将立即退出该方法,这显然不是您打算在此代码中执行的操作。您需要对其进行更改,以使其保留在变量中的格式化字符串上,在方法底部使用该变量,然后在完成所有操作后才返回:
Public Function AddOrdinal(ByVal num As Integer) As String
Dim ordinalDay As String
Select Case (num Mod 100)
Case 11 To 13
ordinalDay = num.ToString() & "th"
End Select
Select Case num Mod 10
Case 1
ordinalDay = num.ToString() & "st"
Case 2
ordinalDay = num.ToString() & "nd"
Case 3
ordinalDay = num.ToString() & "rd"
Case Else
ordinalDay = num.ToString() & "th"
End Select
Return Format(Date.Today, "dd") & ordinalDay & Format(Date.Today, "MMMM YYYY")
End Function
但是,代码仍然存在问题。仍然没有任何意义。它试图同时做两个不同的事情。似乎将两种不同的方法融合在一起。一种方法是将数字作为参数,然后返回数字的格式化序号版本。另一个是将当前日期作为字符串返回(使用当天的序数格式)。 AddOrdinal
对于这两种方法似乎都是一个奇怪的名字。因此,您可以使用一种方法来完成所有操作,例如:
Public Function FormatToday() As String
Dim today As Date = Date.Today
Dim day As Integer = today.Day
Dim ordinalDay As String
Select Case (day Mod 100)
Case 11 To 13
ordinalDay = day.ToString() & "th"
End Select
Select Case day Mod 10
Case 1
ordinalDay = day.ToString() & "st"
Case 2
ordinalDay = day.ToString() & "nd"
Case 3
ordinalDay = day.ToString() & "rd"
Case Else
ordinalDay = day.ToString() & "th"
End Select
Return $"{ordinalDay} {today:MMMM} {today:yyyy}"
End Function
但是,您可能应该通过将问题分成几个单独的步骤来分开关注点:
Public Function FormatToday() As String
Return FormatDate(Date.Today)
End Function
Public Function FormatDate(value As Date) As String
Dim ordinalDay As String = FormatOrdinal(value.Day)
Return $"{ordinalDay} {value:MMMM} {value:yyyy}"
End Function
Public Function FormatOrdinal(num As Integer) As String
Select Case (num Mod 100)
Case 11 To 13
Return num.ToString() & "th"
End Select
Select Case num Mod 10
Case 1
Return num & "st"
Case 2
Return num & "nd"
Case 3
Return num & "rd"
Case Else
Return num & "th"
End Select
End Function
答案 1 :(得分:0)
尝试一下,我对斯蒂文答案的改进。 原因开始了,没有办法使th和nd成为下标,所以我必须将它们分开并键入。
Public Function InsertDate(dateVal As Date)
Dim myMY As String
Dim mOrdinalVal As String
mOrdinalVal = FormatOrdinal(Format(dateVal, "d"))
myMY = Format(dateVal, "MMMM yyyy")
Selection.Font.name = "Cambria"
Selection.Font.Superscript = False
Selection.TypeText (Format(dateVal, "d"))
Selection.Font.Superscript = True
Selection.TypeText (mOrdinalVal)
Selection.Font.Superscript = False
Selection.TypeText (" " & myMY)
End Function