2010-09-30 3 views
0

У меня есть программное обеспечение VB .NET, которое взаимодействует с нагрузкой старых (но звуковых) COM-объектов. VB предоставляет графический интерфейс для COM-объектов, часть которых состоит из установки различных параметров для COM-объектов, некоторые из которых относятся к форматированию строк.Преобразование форматирования C++ printf в/из форматирования строки VB .NET

У меня есть простая пара функций 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), которая обеспечивает достойную готовая реализация? Или, может быть, можно использовать некоторое regexp wizadry?

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

Tim

ответ

1

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

+0

Интерфейс .NET UI предоставляет раскрывающееся меню общих форматов и пытается выбрать тот, который наилучшим образом соответствует формату printf в базовом COM-объекте (для этого приведен код выше). Однако, если ни один из совпадений, я хотел бы показать пользователю нечто иное, кроме строки формата C++, и для этого требуется преобразование в/из формата, показанного пользователю. Я думал, что строка формата .NET будет в порядке, чтобы показать пользователю, хотя, возможно, есть лучшее решение? – ttt

+0

Ну, вы можете сделать это больше похоже на Microsoft Excel, где, когда вы поднимаете диалог форматирования чисел, вы можете сначала выбрать между General/Scientific/Percent/etc (например, '% f','% e' и т. Д.), А затем ввести количество знаков после запятой (что также соответствует строке формата формата printf). Это определенно более удобно для пользователя, чем строка формата printf, и, вероятно, более сложная, чем строка формата .NET. Сколько пользователей будет знать разницу между '0,00',' # .00' и ​​'0.0 #'? –

0

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

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 
Смежные вопросы