PV功能和VB6到C#的移植

时间:2009-09-24 14:06:55

标签: c# vb.net vb6 vb6-migration

我正在努力将一些经典的VB6代码移植到C#,并且偶然发现PV函数的用法。

我觉得错误,包括对Microsoft.VisualBasic程序集的引用。这是通常做的事情,还是我应该探索更多的选择。我想到的下一个想法是在Reflector中探索这个PV功能。

4 个答案:

答案 0 :(得分:10)

this question下已经彻底讨论了使用C#和VB.NET中的 Microsoft.VisualBasic 。 Microsoft.VisualBasic命名空间是fully supported,只要.Net存在就会存在。没有理由避免它。

编辑:这说明在输入时,此问题的其他答案是错误的重新实现该功能,并且不支持单人乐队Code Gallery的图书馆。来吧,对于微软来说,要从VB中删除财务功能需要一个真正的major event

Microsoft.VisualBasic.Compatibility 是一个不同的故事,它专门供VB6升级向导使用, EDIT 现已标记为已过时。 Net 4 (我的预测成真),不应该用于新的开发。删除对此的引用会有一些优势,但我个人可能会尝试实现一个完全工作的端口,首先引用.Net 3.5。

答案 1 :(得分:3)

非常直接在C#中复制

    public static double PV(double Rate, int nPer, double Pmt, double FV, bool Type)
    {
        double ann = Math.Pow(1 + Rate, nPer);
        return -(FV + Pmt * (1 + (Type ? Rate : 0)) * ((ann - 1) / Rate)) / ann;
    }

只需重新安排微软公式provides

答案 2 :(得分:1)

您可以使用此库在f#

中复制excel函数

Library

PV具有现值。我用了一两次。只需将其放入并添加参考。

答案 3 :(得分:0)

我尝试使用已接受的答案,但无法在 .NET Core 中使用它。我环顾四周,在 github 上发现了这段代码,它似乎是微软对 PV 的实现:

https://github.com/microsoft/referencesource/blob/master/Microsoft.VisualBasic/runtime/msvbalib/Financial.vb#L662

    Public Function PV(ByVal Rate As Double, ByVal NPer As Double, ByVal Pmt As Double, Optional ByVal FV As Double = 0, Optional ByVal Due As DueDate = DueDate.EndOfPeriod) As Double

        Dim dTemp As Double
        Dim dTemp2 As Double
        Dim dTemp3 As Double

        If Rate = 0.0# Then
            Return (-FV - Pmt * NPer)
        Else
            If Due <> 0 Then
                dTemp = 1.0# + Rate
            Else
                dTemp = 1.0#
            End If
            dTemp3 = 1.0# + Rate

            '       WARSI Using the exponent operator for pow(..) in C code of PV. Still got
            '       to make sure that they (pow and ^) are same for all conditions
            dTemp2 = dTemp3 ^ NPer

            'Do divides before multiplies to avoid OverFlowExceptions
            Return (-(FV + Pmt * dTemp * ((dTemp2 - 1.0#) / Rate)) / dTemp2)
        End If

    End Function

您仍然需要将其转换为 C#。如果我在本文末尾有一个足够通用的实现,我也会发布。