Ver Mensaje Individual
  #3  
Antiguo 07-11-2017
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Reputación: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Yo tengo estas tres funciones en mi implementación: FormatDateISO8601, FormatAmount y la auxiliar RoundAmount.
Dependiendo del dato y de la versión de Facturae que esté haciendo tomo una cantidad de decimales u otra.
Los nodos son siempre texto y cada nodo puede exigir un formato determinado (fecha, maxima longitud, tipo de caracteres, etc.)

Código Delphi [-]
function FormatDateISO8601(const d: TDateTime): string;
begin
  Result := FormatDateTime('yyyy"-"mm"-"dd', d);
end;

function RoundAmount(const d: double; decimales: integer): double;
begin
  Result := RoundTo(d, decimales * (-1));
end;

function FormatAmount(const d: double; decimales: integer): string;
var
  OldDecimalSeparator : char;
begin
  OldDecimalSeparator := DecimalSeparator; // note: not thread-safe
  DecimalSeparator := '.';
  Result := Format('%.' + IntToStr(decimales) + 'f', [RoundAmount(d, decimales)]); // round explicitly, makes sure that RoundAmount and FormatAmount behaves exactly the same
  DecimalSeparator := OldDecimalSeparator;
end;

[...]

  Decimales := 2;
  if (VersionFacturae = '3.2') then
     Decimales := 2
  else
  if (VersionFacturae = '3.2.1') then
     Decimales := 8;

[...]

     // Tipo impositivo. Téngase en cuenta que no siempre son porcentajes. La legislación del impuesto correspondiente permitirá identificar las unidades y dimensiones del tipo impositivo. Hasta ocho decimales.
     Nodo := NodoPadre.AddChild('TaxRate', DOMString);
     Nodo.Text := FormatAmount(TaxRate, Decimales);

[...]

     // Precio de la unidad de bien o servicio servido/prestado, en la moneda indicada en la Cabecera de la Factura. Siempre sin Impuestos. Hasta ocho decimales.
     Nodo := NodoPadre.AddChild('UnitPriceWithoutTax', DOMString);
     if (VersionFacturae = '3.2') then
        Nodo.Text := FormatAmount(UnitPriceWithoutTax, 6);
     if (VersionFacturae = '3.2.1') then
        Nodo.Text := FormatAmount(UnitPriceWithoutTax, 8);
Responder Con Cita