我有一些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?
非常感谢
添
答案 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