将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?
非常感谢
添
答
你是否真的需要这两种格式,或者是你的用户所采取的一种格式,另一种是使用内部软件的实现细节 - 但可能会消失,如果你有字符串格式化功能,可直接识别用户的选项?
答
你并不需要。 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
.NET UI提供了常用格式的下拉列表,并尝试选择最佳匹配基础COM对象中的printf格式的那个(上面的代码对此是可以的)。但是,如果没有匹配,我想向用户显示C++格式字符串以外的内容,这需要转换为显示给用户的格式。我曾经想过,一个.NET格式的字符串可以显示给用户,但也许有更好的解决方案? – ttt 2010-09-30 22:41:25
好吧,你可以做得更像Microsoft Excel,当你拉起数字格式化对话框时,你可以先选择General/Scientific/Percent/etc(例如'%f','%e'等等),然后输入小数位的数目(其直接对应于printf风格格式字符串以及)。这肯定比printf格式的字符串更加用户友好,并且可能比.NET格式的字符串更重要。有多少用户会知道和'0.0#''0.00','#.00'之间的区别,? – 2010-09-30 23:58:25