VAL 和 Transform 与 visual fox pro 到 c# 转换的结合

Combination of VAL and Transform with visual fox pro to c# conversion

我试图理解以下逻辑以及输出结果的原因。是的,当然,另一个尝试翻译 VFP 的 c# / .net 人。

我已将其削减到最低限度:

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

我正在使用 VFP 库来实现其中的一些功能,例如 TRANSFORM,但它什么也没做。它只是吐出我输入的相同值,但 returns 它是一个字符串。不确定哪里出了问题。

我在c#中得到的值是15264.670000000000000000000000.

好吧,深入研究 VFP 文档,这里是解释:

  1. 截断小数位并四舍五入字段的剩余小数部分。
  2. 如果该值不适合,则使用科学计数法存储字段内容。
  3. 如果该值仍然不合适,请用星号替换字段内容。

有人可以分享 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 的结果。

VFP 中的 transform() 所做的只是根据格式以及一些格式化符号将任何值转换为字符串。这里 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# 中,“转换”步骤不会出现错误,而是 return 没有数据丢失的值,在 C# 中,您可以得到带 2 位小数的正确值。

IOW,您正尝试翻译 VFP 代码中编码错误的部分。