我正在尝试将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
答案 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 Method或String.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
答案 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)