Логика в пользовательском округлении - 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".
Посмотрите ответ по следующей ссылке для получения дополнительной информации: