2016-01-15 60 views
4

我需要下面的C#代码转换为德尔福:带5位小数位的货币?

decimal XYZ = decimal.Round(dataset123.XYZ, 5, MidpointRounding.AwayFromZero); 

结果将在MSSQL数据库保存到浮点型字段。

当我在Delphi中使用double时,有几个问题,因为它没有固定的十进制。另外,当保存到ADO数据库中时,数据库查看器通常会显示非常长的数字,因为它的数字太多。此外,似乎有一个舍入方法问题,舍入不总是“远离零”完成。

我想现在解决最严重的问题。我需要一个5位货币,但德尔福只有数据类型currency有4位数。拥有5位数值是这类项目/业务流程的重要要求。

在一些互联网的来源,我读到人们谈论这样的代码:

var 
    x: Decimal[5,3] 

但是这句法不适用于我。我与德尔福2007年工作。

有什么我可以做得到一个5位数的固定小数?

+0

写基于Int64的自己的类型 –

+2

试试我的[十进制](http://rvelthuis.de/programs/decimals.html)类型。它与.NET Decimal类型兼容,所以你的代码应该很容易移植。 –

+0

@DavidHeffernan我该怎么做?我试过'输入C = 0.00000 .. 99999.99999;',但这不起作用。我不明白为什么Integer可以帮助定义小数。 –

回答

1

下面是使用大卫赫弗南的建议,告诉你如何开始的一些代码:

unit UnitMyCurrency; 

interface 

uses 
    System.SysUtils; 

type 
    TMyCurrency = record 
    Value : int64; 

    class operator implicit(pValue : integer) : TMyCurrency; 
    class operator implicit(pValue : single) : TMyCurrency; 
    class operator implicit(pValue : TMyCurrency) : single; 

    class operator Add(p1 : TMyCurrency; p2 : TMyCurrency) : TMyCurrency; 
    class operator Subtract(p1 : TMyCurrency; p2 : TMyCurrency) : TMyCurrency; 

    class operator NotEqual(p1 : TMyCurrency; p2 : single) : boolean; 
    const 
    cFactor = 100000; 
    end; 

implementation 

{ TMyCurrency } 

class operator TMyCurrency.implicit(pValue: integer): TMyCurrency; 
begin 
    Result := pValue * cFactor; 
end; 

class operator TMyCurrency.implicit(pValue: single): TMyCurrency; 
begin 
    Result := round(pValue * cFactor); 
end; 

class operator TMyCurrency.Add(p1, p2: TMyCurrency): TMyCurrency; 
begin 
    Result := TMyCurrency(p1.Value + p2.Value); 
end; 

class operator TMyCurrency.implicit(pValue: TMyCurrency): single; 
begin 
    Result := pValue.Value/cFactor; 
end; 

class operator TMyCurrency.NotEqual(p1: TMyCurrency; p2: single): boolean; 
begin 
    Result := TMyCurrency(p2).Value <> p1.Value; 
end; 

class operator TMyCurrency.Subtract(p1, p2: TMyCurrency): TMyCurrency; 
begin 
    Result.Value := p1.Value - p2.Value; 
end; 

procedure Test; 
var 
    v1, v2, v3 : TMyCurrency; 
begin 
    v1 := 5.12345; 
    v2 := 6.00000; 
    if (v1 + v2) <> 11.12345 then 
    begin 
    raise Exception.Create('Error Message'); 
    end; 
end; 

end. 

显然,这是不完整的,但完成后,你将有一个新的类型这就是你所需要的,并且你有完全的控制权。

以下显示了如何使用重载操作符。这是西雅图,但一切都没有改变自2007年以来

http://docwiki.embarcadero.com/RADStudio/en/Operator_Overloading_(Delphi)

+0

@David Heffernan - 感谢您的编辑 - 抱歉让您的姓名错误。 – Dsm

-3

简单的方法是使用变量CurrencyDecimals。 类似的东西:

var 
    price: Double; 

begin 
    price:= 1234.56789; 
    CurrencyDecimals := 5; 
    ShowMessage('Price = '+Format('%m', [price])); 
end; 
+5

这是一个二进制浮点类型,提交者需要定点小数。 –

+0

是和:)?我仍然认为实现提问者想要的最好方法是将该值转换为想要的定点值。此外 这留下了价值如何存储和他的视觉表示。 –

+2

我不确定你是否完全理解二进制浮点和定点十进制之间的区别 –