C# 有没有一种方法可以通过编程将VB6格式字符串转换为.NET格式字符串? 有人知道VB6格式字符串的好参考吗 有人知道从VB6格式字符串到.NET字符串的转换器吗
我正在将一个大型VB6代码库移植到.NET。它是一个以数据库为中心的软件,数据库本身包含VB6格式的字符串,这些字符串随后被加载并用于显示数据库中的其他数据C# 有没有一种方法可以通过编程将VB6格式字符串转换为.NET格式字符串? 有人知道VB6格式字符串的好参考吗 有人知道从VB6格式字符串到.NET字符串的转换器吗,c#,string-formatting,vb6-migration,C#,String Formatting,Vb6 Migration,我正在将一个大型VB6代码库移植到.NET。它是一个以数据库为中心的软件,数据库本身包含VB6格式的字符串,这些字符串随后被加载并用于显示数据库中的其他数据 我的问题是,如何移植这个。然而,为这个问题选择的答案不足以满足我的需要。我不喜欢依赖专门为向后兼容而设计的库,我被专门雇来移植这种语言。你最好自己编写转换库,但这可能不是您希望得到的答案。VB6使用的格式化例程实际上内置于操作系统中。Oleaut32.dll,VarFormat()函数。考虑到有多少代码依赖它,它已经存在了15年,并且将永远
我的问题是,如何移植这个。然而,为这个问题选择的答案不足以满足我的需要。我不喜欢依赖专门为向后兼容而设计的库,我被专门雇来移植这种语言。你最好自己编写转换库,但这可能不是您希望得到的答案。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);
}
使用系统;
使用System.Runtime.InteropServices;
班级计划{
静态void Main(字符串[]参数){
Console.WriteLine(Vb6Format(“hi-there”,“>”);
Console.WriteLine(Vb6Format(“您好,”!@@……“不是”);
Console.ReadLine();
}
公共静态字符串VB6格式(对象表达式,字符串格式){
字符串结果;
int hr=VarFormat(ref expr,format,0,0,0,out结果);
如果(hr!=0)抛出新的COMException(“格式错误”,hr);
返回结果;
}
[DllImport(“oleaut32.dll”,CharSet=CharSet.Unicode)]
私有静态extern int VarFormat(ref object expr、字符串格式、int firstDay、int firstWeek、int标志、,
[Marshallas(UnmanagedType.BStr)]输出字符串结果;
}
以下是一些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
数据库中保存的格式是已知的吗?如果是这样,您最好只编写脚本来对该子集执行简单的数据库更新,而不是找到一个工具。无论如何,你都需要仔细检查结果。:-D我希望如此。已经完全考虑过了,但它不是一个已知的集合(即使其中大多数为空)。不幸的是,它还有一个缺点,那就是我们成千上万的用户可能会陷入困境……有办法解决,但查找和替换并不能真正起作用,不。我真的没有抱太大的希望……这就是为什么我还要求提供VB6格式的字符串资源,因为我想我可能必须重新编写它。汉斯,你是救世主。谢谢你的背景。我没有意识到历史;给人的印象是它是VB6的主打产品。简单而狡猾,我喜欢,+1我不知道这段代码是如何工作的。在VB6格式字符串中,第一个
mm
是月,第二个mm
是分钟。对于.Net来说,它们都是分钟。它也不考虑转义文字和引用文字。