Комбинация VAL и преобразования с преобразованием Visual fox pro в c #

#c# #visual-foxpro

#c# #visual-foxpro

Вопрос:

Я пытаюсь понять следующую логику и почему результат такой, какой он есть. Да, конечно, другой пользователь c # / .net пытается перевести VFP.

Я сократил его до минимума:

 a = 19537.7
b = 23810.73
result1 = a-((b/a-1)*a)    
result2 = TRANSFORM(result1,[999.99])
result3 = VAL(result2)
 
  • результат1: 15264.67000
  • результат2: "***.**"
  • результат 3: 0.00

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

Значение, которое я получаю в c #, равно 15264.670000000000000000000000 .

Итак, копаясь в документах VFP, вот объяснение:

  1. Усечение десятичных знаков и округление оставшейся десятичной части поля.
  2. Если значение не подходит, сохраните содержимое поля, используя научную нотацию.
  3. Если значение по-прежнему не подходит, замените содержимое поля звездочками.

У кого-нибудь есть рабочий метод, которым они могут поделиться для функции TRANSFORM()? И, надеюсь, VAL() также, потому что вспомогательная библиотека, которую я использую, пытается преобразовать в int32, но VFP, конечно, этого не делает.

Комментарии:

1. Не уверен, о чем вы просите? Эквивалент этих функций в C #?

2. @stuartd, правильно… и для области моего приложения я, вероятно, могу просто использовать некоторую математику и получить тот же результат, но, учитывая, что эта функция не может быть найдена во вспомогательных библиотеках (по крайней мере, я ее не нашел), надеюсь, это поможет и другим.

3. Прошло очень много времени с тех пор, как я использовал VFP, но этот код, похоже , должен округлять число до двух знаков после запятой. Но для этого вы бы использовали ROUND. Я думаю, вам придется использовать контекст, в котором отображается фактический фактический код, для его перевода.

Ответ №1:

Для начала:

 a = 19537.7
b = 23810.73
result1 = a-((b/a-1)*a)    
result2 = TRANSFORM(result1,[999.99])
result3 = VAL(result2)
 

в VFP просто плохое программирование, или эти строки никогда не должны были давать результат выше 999,99.

Что transform() делает в VFP, так это просто преобразует любое значение в строку на основе формата вместе с некоторыми символами форматирования. Здесь TRANSFORM() просто пытается форматировать строку 5: F2:

 decimal a = 19537.7M;
decimal b = 23810.73M;
var result1 = a - ((b / a - 1) * a);
Console.WriteLine(result1);
var result2 = $"{result1,5:F2}";
Console.WriteLine(result2);
decimal.TryParse(result2, out decimal result3);
Console.WriteLine(result3);
 

Обычно это эквивалентно коду VFP. Однако в VFP вы можете подумать, что ошибка, если результирующая длина строки превышает спецификацию формата, чем выполняется length, и значение «переполняется», и оно имеет представление строки, соответствующее формату as "***.**" . * означает, что числовое значение превысило «длину строки хранилища».

Val() просто представляет собой преобразование из строки в числовое значение (с плавающей точкой). В VFP, поскольку результирующее значение является ошибочным "***.**" , его преобразование в числовое значение приводит к 0. В VFP, если строка не представляет числовое значение, в отличие от C #, вместо исключения, оно равно 0. Это похоже на выполнение преобразования с помощью .Попробуйте выполнить синтаксический анализ(), где он не будет генерировать исключение, но также будет равен 0.

Поскольку в C # шаг «transform» не приведет к такой ошибке и вместо этого вернет значение без потери данных, в C # вы получите правильное значение обратно с 2 десятичными знаками.

ДА, на ваш шанс, вы пытались перевести плохо закодированную часть кода VFP.