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)
- 结果 1:
15264.67000
- 结果 2:
"***.**"
- 结果 3:
0.00
我正在使用 VFP 库来实现其中的一些功能,例如 TRANSFORM,但它什么也没做。它只是吐出我输入的相同值,但 returns 它是一个字符串。不确定哪里出了问题。
我在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 的结果。
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 代码中编码错误的部分。
我试图理解以下逻辑以及输出结果的原因。是的,当然,另一个尝试翻译 VFP 的 c# / .net 人。
我已将其削减到最低限度:
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,但它什么也没做。它只是吐出我输入的相同值,但 returns 它是一个字符串。不确定哪里出了问题。
我在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 的结果。
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 代码中编码错误的部分。