如何将格式函数从VB更新到VB.NET

时间:2012-08-05 00:30:42

标签: vb.net vb6 porting vb6-migration

我正在尝试将VB函数移植到VB.NET,但我无法使该函数正常工作并正确更新。

rFormat = Format(Format(Value, fmt), String$(Len(fmt), "@"))

似乎问题在于String$()函数参数,它用于对齐小数点值。我怎样才能正确解决这个问题,还是有另一种方法来实现这个目标?

修改

以下是一个示例控制台应用程序,它显示了我遇到的问题。

Imports Microsoft.VisualBasic
Module Module1

Sub Main()
    Dim rFormat As String
    Dim fmt As String
    Dim value As Object

    fmt = "########.000"
    value = 12345.2451212
    'value = 12345
    '~~~~~~~~~~~~~~~~~~~~~

    'rFormat = Microsoft.VisualBasic.Format(Microsoft.VisualBasic.Format(value, fmt), "".PadLeft(fmt.Length, "@"c))
    'Console.WriteLine(rFormat) ' <<Not working prints all "@" for any value!>>>

    'rFormat = Microsoft.VisualBasic.Format(Microsoft.VisualBasic.Format(value, fmt), "".PadLeft(fmt.Length))
    'Console.WriteLine(rFormat) '<<Not working prints nothing>>

    'rFormat = (String.Format(value, fmt)).PadLeft(Len(fmt))
    'Console.WriteLine(rFormat) ' <<Not working prints the value 12345.2451212>>> should print>>>>> 12345.245
    'for integer values< works good>

    rFormat = String.Format("{0," + fmt.Length.ToString + "}", String.Format(value, fmt))
    Console.WriteLine(rFormat) ' <<Not working prints the value 12345.2451212>>> should print>>>>> 12345.245
    'for integer values< works good>


End Sub

End Module

3 个答案:

答案 0 :(得分:3)

所有String$都会重复第二个参数中指定的字符,即第一个参数中指定的次数。

因此,如果fmt是“9999”,那么String $命令将产生“@@@@”。

您可以使用String.PadLeft方法替换它,并继续使用Microsoft.VisualBasic命名空间中的VB Format函数:

    rFormat = Microsoft.VisualBasic.Format(Microsoft.VisualBasic.Format(value, fmt), "".PadLeft(fmt.Length, "@"c))

编辑:

根据问题中的编辑,正确的格式逻辑应为:

    rFormat = String.Format("{0:" & fmt & "}", value)

审核String.Format documentation非常有帮助,因为它有很多例子和解释。

答案 1 :(得分:1)

听起来你想填写你的结果所以它们是固定的长度。如何使用String.PadLeft MethodString.PadLeft(int32,char) Method填写rFormat。

对于空格这样的东西:

rFormat = (String.Format(value, fmt)).PadLeft(Len(fmt))

修改

男孩很难在网上找到VB6文档。似乎VB6自定义格式中的@与每个Forum posting的字符串对齐有关,而SO answer他们建议使用类似的东西。

rFormat = String.Format("{0," + fmt.Length.ToString + "}", String.Format(value, fmt))

这是使用Composite Formatting对齐组件

  

对齐组件

     

可选对齐组件是一个有符号整数,表示首选的格式化字段宽度。如果alignment的值小于格式化字符串的长度,则忽略alignment,并将格式化字符串的长度用作字段宽度。如果对齐为正,则字段中的格式化数据右对齐,如果对齐为负,则对齐左对齐。如果需要填充,则使用空格。如果指定了对齐,则需要逗号。


我在更新的示例中看到的主要问题是您使用对象存储Double。通过将值声明更改为Decimal并更改格式函数,我能够使其工作。

Sub Main()
    Dim rFormat As String
    Dim fmt As String
    Dim value As Double

    fmt = "#######0.000"
    value = 12345.2451212



    rFormat = String.Format("{0," + fmt.Length.ToString + "}", value.ToString(fmt))
    Console.WriteLine(rFormat) 
    Console.ReadLine()
End Sub

enter image description here

答案 2 :(得分:0)

VBNet中,您也可以这样做:

Dim rFormat As String = String.Empty
Dim fmt As String = "########.000"
Dim value As Object = 12345.2451212

rFormat = (CDbl(value)).ToString(fmt)