Логика в пользовательском округлении - VB Script - QTP

У меня есть файл данных, где десятичные точки не указаны для десятичного числа. Число только что описано в макете для файла данных как первые 2 цифры как действительные и следующие 2 цифры как десятичные, и оно варьируется для разных полей, вещественной и десятичной части

Таким образом, фактическое число 12345.6789 указано как 123456789. Когда я хочу, чтобы это было округлено до 2 десятичных знаков, чтобы соответствовать значению в приложении, я использую приведенную ниже логику

Public Function Rounding(NumberValue, DecimalPoints, RoundOff)

        Rounder= Roundoff+1
    Difference = DecimalPoints - Rounder
    NumberValue = Mid(NumberValue, 1, Len(NumberValue)-Difference)

    RealNumber=Mid(NumberValue,1,Len(NumberValue)-Rounder)
    DecimalNumber=Right(NumberValue,Rounder)

    NumberValue = RealNumber&"."&DecimalNumber
    NumberValue = Cdbl(NumberValue)
    NumberValue = Round(NumberValue, Roundoff)
    Rounding = FormatNumber(NumberValue,Difference+1,,,0)

End Function

Однако проблема с этой логикой заключается в том, что я не могу округлить десятичные дроби, когда число имеет 0 в качестве десятичного значения

Например, давайте возьмем 12345,0000, который я хочу округлить до 2 десятичных знаков

Моя функция возвращает его как 12345, тогда как я хочу, чтобы это было возвращено как 12345.00

Любые идеи о том, как эту логику можно настроить, чтобы получить желаемый результат, или это вообще невозможно?

2 ответа

Решение

Чтобы получить десятичные разряды, используйте Formatnumber функция. См. http://msdn.microsoft.com/en-us/library/ws343esk(v=vs.84).aspx - по умолчанию это обычно 2 десятичных знака, но это настройки региона, специфичные при использовании значений по умолчанию.

Ваш скрипт также имеет небольшую проблему, если переменная decimalpoints совпадает с переменной округления - она ​​не будет заполняться Rounding с результатом. Я также не уверен, почему вы сравниваете DecimalPoints с Roundoff (-1)?

Я пересмотрел всю процедуру - она ​​должна делать то, что вы хотите (хотя я не знаю, какими ценностями вы ее кормите) - так что теперь она будет работать так:


Делаем 4 цифры:

Округление (123450001, 4, 2)

Результат:

12345,00


Делаем 2 цифры:

Округление (123450001, 2, 2)

Результат:

1234500,01


Выполнение 4 цифр (увеличивается, если>.5)

Округление (876512345678, 8, 4)

Результат:

8765.1235

Пересмотренная упрощенная функция, которая должна делать все, что вы просите:

Public Function Rounding(NumberValue, DecimalPoints, RoundOff )

    RealNumber = Mid(NumberValue, 1, Len(NumberValue)-DecimalPoints)
    DecimalNumber = Round("." & Right(NumberValue,DecimalPoints), RoundOff)
    Rounding = FormatNumber(RealNumber + DecimalNumber,RoundOff,,,0)

End Function

Вот рабочая версия вашей функции:

Public Function Rounding(NumberValue, DecimalPoints, RoundOff)

    RealNumber=left(NumberValue,Len(NumberValue)-DecimalPoints)
    DecimalNumber="." & Right(NumberValue,DecimalPoints)
    NumberValue = RealNumber + DecimalNumber
    NumberValue = Round(NumberValue,RoundOff)
    Rounding = FormatNumber(NumberValue, RoundOff,,,0)

End Function

Я уверен, что вы не сможете использовать функцию Round() для того, что вам нужно. Посмотрите на функции FormatNumber() или FormatCurrency(), поскольку у них есть опция "IncludeLeadingZero".

Посмотрите ответ по следующей ссылке для получения дополнительной информации:

VBScript округлить до 2 десятичных знаков с помощью Ccur

Другие вопросы по тегам