3

我正在尝试将 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
4

3 回答 3

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 文档非常有帮助,因为它有很多示例和解释。

于 2012-08-05T00:57:27.170 回答
1

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

像这样的空间:

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

编辑

男孩很难在网上找到 VB6 文档。似乎@VB6 自定义格式中的 VB6 自定义格式与此论坛帖子中的字符串对齐方式有关,并且此SO 回答他们提出了类似的建议。

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

这是使用复合格式对齐组件

对齐组件

可选的对齐组件是一个有符号整数,表示首选的格式化字段宽度。如果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

在此处输入图像描述

于 2012-08-05T00:53:52.183 回答
0

VBNet中,您也可以这样做:

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

rFormat = (CDbl(value)).ToString(fmt)
于 2012-08-06T00:38:02.213 回答