Преобразование форматирования c ++ printf в / из форматирования строк VB .NET - PullRequest
0 голосов
/ 01 октября 2010

У меня есть некоторое программное обеспечение VB .NET, которое взаимодействует с множеством старых (но надежных) COM-объектов.VB предоставляет графический интерфейс для объектов COM, часть которого состоит из установки различных параметров для объектов 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), который обеспечиваетдостойная готовая реализация?Или, может быть, можно использовать какой-нибудь мастер регулярных выражений?

Большое спасибо

Тим

Ответы [ 3 ]

1 голос
/ 01 октября 2010

Вам действительно нужны оба формата, или один формат принят вашими пользователями, а другой используется внутри деталей реализации вашего программного обеспечения - но может исчезнуть, если у вас есть функции форматирования строк, которые распознают параметры ваших пользователей напрямую?

0 голосов
/ 30 января 2014
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
0 голосов
/ 01 октября 2010

Вам не нужно.В Windows это встроенное форматирование.Вы можете просто P / Invoke wsprintf из User32.dll.

...