问题描述
我试图理解以下逻辑以及为什么输出是这样的。是的,当然,另一个试图翻译 VFP 的 c#/.net 人。
我已经把它缩减到最低限度了:
a = 19537.7
b = 23810.73
result1 = a-((b/a-1)*a)
result2 = TRANSFORM(result1,[999.99])
result3 = VAL(result2)
- result1:
15264.67000
- result2:
"***.**"
- result3:
0.00
我将 VFP 库用于其中一些功能,例如 TRANSFORM,但它没有做任何事情。它只是吐出我输入的相同值,但将其作为字符串返回。不知道那里出了什么问题。
我在 c# 中得到的值是 15264.670000000000000000000000
。
好的,深入了解 VFP 文档,解释如下:
有人可以分享 TRANSFORM() 函数的工作方法吗?并且希望 VAL() 也是如此,因为我使用的帮助程序库尝试转换为 int32,但 VFP 肯定不会这样做。
解决方法
开始:
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 中,您可能会认为这是一个错误,如果结果字符串长度大于格式规范,则遵循长度并且值“溢出”,并且它具有与 "***.**"
格式匹配的字符串表示形式。 * 表示数值溢出了“存储字符串长度”。
Val() 只是从字符串到数字(浮点数)的转换。在 VFP 中,由于结果值是错误的 "***.**"
,因此将其转换为数字结果为 0。
在 VFP 中,如果一个字符串不代表数字,与 C# 不同,它不会抛出异常,而是 0。这看起来像使用 .TryParse() 进行转换,它不会抛出异常但也为 0 .
由于在 C# 中,“转换”步骤不会出现这种问题,而是在不丢失数据的情况下返回值,在 C# 中,您可以返回带有 2 位小数的正确值。
IOW,您有机会尝试翻译 VFP 代码的错误编码部分。