简体   繁体   English

有没有办法以编程方式将VB6格式化字符串转换为.NET格式化字符串?

[英]Is there a way to programmatically convert VB6 Formatting strings to .NET Formatting strings?

  1. Does anyone know of a good reference for VB6 format-strings? 有谁知道VB6格式字符串的一个很好的参考?
  2. Does anyone know of a converter from VB6 formatting strings to .NET strings? 有谁知道从VB6格式化字符串到.NET字符串的转换器?

I'm working on porting a large VB6 code base to .NET. 我正在努力将大型VB6代码库移植到.NET。 It is a database centric piece of software, and the database itself holds VB6 format-strings which are later loaded and used to display other data in the database. 它是一个以数据库为中心的软件,数据库本身保存VB6格式字符串,稍后加载并用于显示数据库中的其他数据。

My question, like this article , is how to port this. 我的问题,就像这篇文章一样 ,是如何移植它的。 However the answer chosen for that question isn't adequate for my needs. 但是,为该问题选择的答案不足以满足我的需求。 I'm uncomfortable relying on libraries specifically designed for backwards compatibility with a language I've been specifically hired to port away. 我依赖专门为后向兼容我专门雇用的语言设计的库而感到不舒服。

The formatting routine that VB6 uses is actually built into the operating system. VB6使用的格式化例程实际上内置在操作系统中。 Oleaut32.dll, the VarFormat() function. Oleaut32.dll,VarFormat()函数。 It's been around for 15 years and will be around for ever, considering how much code relies on it. 考虑到有多少代码依赖它,它已经存在了15年并将永远存在。 Trying to translate the formatting strings to a .NET composite formatting string is a hopeless task. 尝试将格式化字符串转换为.NET复合格式化字符串是一项毫无希望的任务。 Just use the OS function. 只需使用操作系统功能。

Here's a sample program that does this, using the examples from the linked thread: 这是一个使用链接线程中的示例执行此操作的示例程序:

using System;
using System.Runtime.InteropServices;

class Program {
    static void Main(string[] args) {
        Console.WriteLine(Vb6Format("hi there", ">"));
        Console.WriteLine(Vb6Format("hI tHeRe", "<"));
        Console.WriteLine(Vb6Format("hi there", ">!@@@... not @@@@@"));
        Console.ReadLine();
    }

    public static string Vb6Format(object expr, string format) {
        string result;
        int hr = VarFormat(ref expr, format, 0, 0, 0, out result);
        if (hr != 0) throw new COMException("Format error", hr);
        return result;
    }
    [DllImport("oleaut32.dll", CharSet = CharSet.Unicode)]
    private static extern int VarFormat(ref object expr, string format, int firstDay, int firstWeek, int flags,
        [MarshalAs(UnmanagedType.BStr)] out string result);
}

你最好的选择可能是自己编写转换库,但这可能不是你希望得到的答案。

Here's some F# code that translates the majority of pre-defined and custom VB6-style numeric and date format strings to something suitable for String.Format . 下面是一些F#代码,它们将大多数预定义和自定义VB6样式的数字和日期格式字符串转换为适合String.Format字符串。 It's easily called from C# or VB of course. 当然,它很容易从C#或VB调用。

open System

module VB6Format =

    /// Converts a VB6-style format string to something suitable for String.Format()
    let Convert(vb6Format) =
        if String.IsNullOrWhiteSpace(vb6Format) then "{0}" else
        match if vb6Format.Length > 1 then vb6Format.ToUpperInvariant() else vb6Format with
        // PREDEFINED NUMERIC: http://msdn.microsoft.com/en-us/library/y006s0cz(v=vs.71).aspx
        | "GENERAL NUMBER" | "G"       -> "{0:G}"
        | "g"                          -> "{0:g}"
        | "CURRENCY" | "C" | "c"       -> "{0:C}"
        | "FIXED" | "F"                -> "{0:F}"
        | "f"                          -> "{0:f}"
        | "STANDARD" | "N" | "n"       -> "{0:N}"
        | "PERCENT" | "P" | "p"        -> "{0:P}"
        | "SCIENTIFIC"                 -> "{0:E2}"
        | "E" | "e"                    -> "{0:E6}"
        | "D" | "d"                    -> "{0:D}"
        | "X" | "x"                    -> "{0:X}"
        | "YES/NO" | "ON/OFF"          // we can't support these
        | "TRUE/FALSE"                 -> "{0}"
        // PREDEFINED DATE/TIME: http://msdn.microsoft.com/en-us/library/362btx8f(v=VS.71).aspx
        | "GENERAL DATE" | "G"         -> "{0:G}"
        | "LONG DATE" | "D"            -> "{0:D}"
        | "MEDIUM DATE"
        | "SHORT DATE" | "d"           -> "{0:d}"
        | "LONG TIME" | "T"            -> "{0:T}"
        | "MEDIUM TIME"
        | "SHORT TIME" | "t"           -> "{0:t}"
        | "M" | "m"                    -> "{0:M}"
        | "R" | "r"                    -> "{0:R}"
        | "s"                          -> "{0:s}"
        | "u"                          -> "{0:u}"
        | "U"                          -> "{0:U}"
        | "Y" | "y"                    -> "{0:Y}"
        // USER-DEFINED: http://msdn.microsoft.com/en-us/library/4fb56f4y(v=vs.71).aspx
        //               http://msdn.microsoft.com/en-us/library/73ctwf33(v=VS.71).aspx
        // The user-defined format strings translate more-or-less exactly, so we're just going to use them.
        | _                            -> sprintf "{0:%s}" vb6Format

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM