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

问题描述:

我有一些VB .NET软件可以连接到一些旧的(但声音很好的)COM对象。的VB提供了COM对象,其中一部分由设置在COM对象的各种选项的GUI - 其中一些涉及字符串格式化。将C++ printf格式转换为VB .NET字符串格式

我有一个简单对,其将基本%F,%d,%G格式向/从使用大的情况下选择特定覆盖共同串.NET等效,但它们不覆盖所有格式VB .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?

非常感谢

你是否真的需要这两种格式,或者是你的用户所采取的一种格式,另一种是使用内部软件的实现细节 - 但可能会消失,如果你有字符串格式化功能,可直接识别用户的选项?

+0

.NET UI提供了常用格式的下拉列表,并尝试选择最佳匹配基础COM对象中的printf格式的那个(上面的代码对此是可以的)。但是,如果没有匹配,我想向用户显示C++格式字符串以外的内容,这需要转换为显示给用户的格式。我曾经想过,一个.NET格式的字符串可以显示给用户,但也许有更好的解决方案? – ttt 2010-09-30 22:41:25

+0

好吧,你可以做得更像Microsoft Excel,当你拉起数字格式化对话框时,你可以先选择General/Scientific/Percent/etc(例如'%f','%e'等等),然后输入小数位的数目(其直接对应于printf风格格式字符串以及)。这肯定比printf格式的字符串更加用户友好,并且可能比.NET格式的字符串更重要。有多少用户会知道和'0.0#''0.00','#.00'之间的区别,? – 2010-09-30 23:58:25

你并不需要。 Windows具有内置的格式。你可以简单的P/Invoke wsprintf从User32.dll中。

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