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