添加顺序日期

时间:2019-03-22 12:06:17

标签: .net vb.net

我正在尝试使用如下所示的公共函数添加序数日期

 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,但是我必须缺少一些东西。

任何帮助将不胜感激。

谢谢

2 个答案:

答案 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