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; DecimalSeparator := '.';
Result := Format('%.' + IntToStr(decimales) + 'f', [RoundAmount(d, decimales)]); DecimalSeparator := OldDecimalSeparator;
end;
[...]
Decimales := 2;
if (VersionFacturae = '3.2') then
Decimales := 2
else
if (VersionFacturae = '3.2.1') then
Decimales := 8;
[...]
Nodo := NodoPadre.AddChild('TaxRate', DOMString);
Nodo.Text := FormatAmount(TaxRate, 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);