小编B P*_*ete的帖子

如何在.Net中将字符串格式化为固定宽度字段?

我正在尝试将任意长度的字符串格式化为固定宽度字段以供显示.

我们使用宽度20作为示例,并调用要格式化的字符串s.我将格式化的字符串添加到名为b的StringBuilder中.

Dim b As New System.Text.StringBuilder()
Dim s as New String
Run Code Online (Sandbox Code Playgroud)

如果我要显示的字符串短于20个字符,我可以这样做:

b.Append(s.PadRight(20))
Run Code Online (Sandbox Code Playgroud)

要么

b.AppendFormat("{0,-20}", s)
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但是,如果字符串超过20个字符,我希望字符串在被追加时被截断为20个字符.上面的代码附加整个字符串.

我试过这个:

b.Append(s.Substring(0,20).PadRight(20))
Run Code Online (Sandbox Code Playgroud)

但是,如果字符串短于20个字符,则会触发异常.

所以,我最终得到:

b.Append(s.PadRight(20).Substring(0,20))
Run Code Online (Sandbox Code Playgroud)

这似乎做了这个工作.PadRight通过确保在执行Substring之前字符串有20个字符来防止异常.

我想知道是否有一个替代方法看起来更优雅,并避免填充字符串只是为了防止子字符串导致异常.我是否错过了一步可以完成此任务的String.Format功能?

编辑添加解决方案:

我最终得到以下代码:

Module Extensions
    <Extension()> _
    Function AppendFixed(ByVal b As StringBuilder, ByVal s As String, ByVal width As Integer) As StringBuilder
        If s.Length >= width Then
            b.Append(s, 0, width)
        Else
            b.Append(s)
            b.Append(" ", width - s.Length)
        End If
        Return b
    End Function
End Module
Run Code Online (Sandbox Code Playgroud)

这使用扩展方法来清理语法,如Joel和Merlyn所建议的那样,并使用StringBulider Append重载来避免创建必须进行垃圾收集的新字符串,如supercat所建议的那样.感谢那些有帮助的人.

.net vb.net

6
推荐指数
1
解决办法
9158
查看次数

VB6源文件中的属性VB_VarUserMemID

我正在使用写字板查看一些遗留的VB6代码(因为我没有安装VB6).在模块级别的许多变量声明之后,我看到第二行为变量设置了某种属性,如下例所示.似乎所有声明的属性编号1073741852都是相同的.

Public testPath as Integer
Attribute TestPath.VB_VarUserMemID = 1073741852 
Run Code Online (Sandbox Code Playgroud)

由于我没有在VB6中打开代码,我不确定属性行是否在VB6 ide中可见.

有谁知道这个属性的意义?

vb6

5
推荐指数
1
解决办法
1226
查看次数

.Net 中的数据表与集合

我正在编写一个程序,它需要读取一组记录,这些记录描述了我需要与之通信的设备的寄存器映射。每条记录都有一些字段来描述每个寄存器的属性。

我真的不需要在我的 VB 或 C# 程序中编辑或修改数据,尽管我希望能够在网格上显示数据。我想将数据存储在 CSV 文件或 XML 文件中。我需要让用户能够离线编辑数据,最好是在 excel 中。

我正在考虑使用 DataTable 或“注册”对象的集合(我将定义)。

我设计了一个 DataTable 原型,发现我可以使用内置方法轻松读取/写入 XML,并且可以轻松绑定到 DataGridView。即使我定义了一个唯一的主键列,我也无法找到一种方法来在不使用返回行集合的查询的情况下检索单个寄存器上的信息。从列中获取值的语法也很复杂,尽管我可能在这两个方面都遗漏了一些东西。

我很想使用可以通过唯一键访问的“注册”对象集合。预先编码会多一点,但总体上似乎是一个更清晰的解决方案。我应该仍然可以在需要时使用 LINQ to dataset 来查询寄存器的子集,但也可以使用键值获取单个字段,例如:Registers(keyValue).fieldName。

哪个是解决问题的更干净的方法?

有没有办法在不需要自定义代码的情况下将 XML 读/写到集合中?

这可以使用 String 作为键来完成吗?

更新:听起来共识是针对寄存器对象的集合。我感觉合理。我倾向于那样,因为没有人指出任何可以简化单行访问的 DataTable 功能,看起来 Collection 显然是要走的路。感谢那些称重的人。

c# vb.net

1
推荐指数
1
解决办法
5897
查看次数

标签 统计

vb.net ×2

.net ×1

c# ×1

vb6 ×1