将c ++ printf格式转换为VB .NET字符串格式

时间:2010-09-30 22:28:06

标签: .net c++ vb.net printing string-formatting

我有一些VB .NET软件可以连接旧的(但声音的)COM对象。 VB为COM对象提供了一个GUI,其中一部分包括在COM对象上设置各种选项 - 其中几个与字符串格式有关。

我有一对简单的VB .NET函数,它们使用覆盖特定公共字符串的大型选择案例将基本的%f,%d,%g格式转换为.NET等价格,但它们并不涵盖所有格式。这就是我有的......

        ElseIf f = "%.3f" Then
            return "0.000"
        ElseIf f = "%.2f" Then
            return "0.00"
        ElseIf f = "%.1f" Then
            return "0.0"

在我开始潜入并通过一些解析使其更通用之前,有没有人知道一个类(例如VB或C#.NET)提供了一个像样的现成实现?或者也许可以使用一些正则表达式wizadry?

非常感谢

3 个答案:

答案 0 :(得分:1)

您真的需要这两种格式,或者是您的用户采用的一种格式,另一种是在软件的实施细节中使用 - 但如果您有直接识别用户选项的字符串格式化功能,可能会消失吗?

答案 1 :(得分:0)

你不需要。 Windows内置了这种格式。您可以从User32.dll简单地P / Invoke wsprintf

答案 2 :(得分:0)

Private Const _format_string = "\%(?<length>\d+)?(\.?(?<precision>\d+)?)(?<type>\w)"

Public Shared Function ToNet(format As String) As String
    Dim regex As New Regex(_format_string, RegexOptions.IgnoreCase _
                           Or RegexOptions.CultureInvariant _
                           Or RegexOptions.IgnorePatternWhitespace _
                           Or RegexOptions.Compiled)

    Dim m As Match = regex.Match(format)
    Dim numberTypeFormat As String = String.Empty
    Dim precision As Integer = 1
    Dim precisionFieldName As String = "precision"

    If m.Success Then
        Select Case m.Groups("type").Value
            Case "d", "i", "n", "u", "o"
                numberTypeFormat = "D"
                precisionFieldName = "length"

            Case "x", "X"
                numberTypeFormat = "X"

            Case "f", "F"
                numberTypeFormat = "N"
                precision = 6

            Case "e", "E"
                numberTypeFormat = "E"
                precision = 6

            Case "s"
                Throw New ArgumentException("String type format string not supported", "format")

        End Select

        If m.Groups(precisionFieldName).Success Then
            precision = Integer.Parse(m.Groups(precisionFieldName).Value)

        End If

        Return String.Format("{0}{1}", numberTypeFormat, precision)


    Else
        Throw New ArgumentException("C++ Format string not recognized", "format")

        Return String.Empty

    End If

End Function