Есть ли способ программно преобразовать строки форматирования VB6 в строки форматирования .NET? - PullRequest
7 голосов
/ 01 ноября 2010
  1. Кто-нибудь знает хороший справочник для строк формата VB6?
  2. Кто-нибудь знает конвертер из строк форматирования VB6 в строки .NET?

Я работаю над переносом большой базы кода VB6 на .NET. Это программное обеспечение, ориентированное на базу данных, и сама база данных содержит строки формата VB6, которые впоследствии загружаются и используются для отображения других данных в базе данных.

Мой вопрос, как и в этой статье , как это портировать. Однако ответ на этот вопрос не подходит для моих нужд. Мне неудобно полагаться на библиотеки, специально разработанные для обратной совместимости с языком, который я специально нанял для переноса.

Ответы [ 3 ]

15 голосов
/ 01 ноября 2010

Процедура форматирования, которую использует VB6, фактически встроена в операционную систему.Oleaut32.dll, функция VarFormat ().Он существует уже 15 лет и будет существовать вечно, учитывая, насколько на него опирается код.Попытка перевести строки форматирования в составную строку форматирования .NET - безнадежная задача.Просто используйте функцию ОС.

Вот пример программы, которая делает это, используя примеры из связанной ветки:

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);
}
0 голосов
/ 30 августа 2011

Вот некоторый код F #, который переводит большинство предопределенных и пользовательских строк формата чисел и даты в стиле VB6 в нечто, подходящее для String.Format.Конечно, он легко вызывается из 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
0 голосов
/ 01 ноября 2010

Лучше всего написать саму библиотеку конверсий, но, вероятно, это был не тот ответ, который вы надеялись получить.

...