Как обновить функцию форматирования с VB до VB.NET

Я пытаюсь перенести функцию 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

person Matthew    schedule 05.08.2012    source источник
comment
Я не уверен, как пометка VB6 вам поможет. Это все равно что спрашивать англоговорящего, как сказать что-то по-эльбонски.   -  person Bob77    schedule 05.08.2012
comment
для тех из нас, у кого есть «ржавые» (или несуществующие) навыки работы с VB6, можете ли вы сообщить нам, какого формата вы пытаетесь достичь, и мы сможем решить эту проблему таким образом.   -  person Jim O'Neil    schedule 05.08.2012
comment
Вот документация для @ в функции формата VB6 msdn.microsoft. com / en-us / library / aa263413 (v = vs.60)   -  person MarkJ    schedule 05.08.2012
comment
Я пометил VB6, чтобы, возможно, помочь кому-то, у кого были такие же проблемы с обновлением до VB.NET. @Jim, я добавил правку в свой исходный пост, чтобы включить более подробную информацию о проблемах с форматом, которые я пытаюсь решить, спасибо за ваше предложение!   -  person Matthew    schedule 06.08.2012


Ответы (3)


В VBNet вы также можете сделать это:

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

rFormat = (CDbl(value)).ToString(fmt)
person Ambrose    schedule 06.08.2012

Все, что делает String$, - это повторяет символ, указанный во втором параметре, количество раз, указанное в первом параметре.

Так, если fmt, например, «9999», то команда String $ выдаст «@@@@».

Вы можете заменить это методом String.PadLeft и продолжать использовать функцию VB Format из пространства имен Microsoft.VisualBasic:

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

РЕДАКТИРОВАТЬ:

Основываясь на правке в вопросе, правильная логика формата должна быть:

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

Очень полезно просмотреть документацию String.Format. так как в нем много примеров и объяснений.

person competent_tech    schedule 05.08.2012
comment
Спасибо за Ваш ответ. Я строго пытался обновиться до VB.NET. Я обновил свой пост выше, чтобы включить более подробную информацию о моих ошибках. Вы бы хоть представляли, как это исправить? Весь мой код VB6 работает, а мой код VB.NET - нет. - person Matthew; 06.08.2012
comment
Хорошо, это помогает лучше понять, что вы ищете. Я обновил ответ некоторым кодом, который даст желаемый результат. - person competent_tech; 06.08.2012

Похоже, вы хотите дополнить свои результаты, чтобы они были фиксированной длины. Как насчет использования метода String.PadLeft или String.PadLeft (int32, char) Метод для заполнения rFormat.

Примерно так для пробелов:

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

Изменить

Мальчик, трудно найти документацию по VB6 в Интернете. Похоже, что @ в пользовательском формате VB6 имеет отношение к выравниванию строки согласно этому Сообщение на форуме и этот ответ SO, они предлагают что-то вроде этого.

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

Используется компонент выравнивания составного форматирования

Компонент выравнивания

Необязательный компонент выравнивания - это целое число со знаком, указывающее предпочтительную ширину отформатированного поля. Если значение выравнивания меньше длины форматированной строки, выравнивание игнорируется, и длина форматированной строки используется как ширина поля. Отформатированные данные в поле выравниваются по правому краю, если выравнивание положительное, и по левому краю, если выравнивание отрицательное. Если заполнение необходимо, используется пробел. Запятая требуется, если указано выравнивание.


Основная проблема, которую я вижу в вашем обновленном примере, заключается в том, что вы используете объект для хранения своего 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

введите описание изображения здесь

person Mark Hall    schedule 05.08.2012
comment
Вот документация для @ в функции формата VB6 msdn.microsoft. com / en-us / library / aa263413 (v = vs.60) - person MarkJ; 05.08.2012
comment
Спасибо @Mark, ваше решение сработало для меня при использовании целочисленных значений, хотя при использовании двойных значений у меня возникают проблемы. Я добавил правку к своему исходному сообщению, которая должна объяснить мои проблемы. - person Matthew; 06.08.2012
comment
@Matthew См. Мою правку, часть проблемы в том, что вы используете объект. Я также изменил формат преобразования. посмотрим, работает ли это для вас. - person Mark Hall; 06.08.2012