Decimal

Reprezentacja wartości dziesiętnej, np.2,5. Klienci mogą konwertować wartości na formaty dziesiętne używane w danym języku, np. BigDecimal w języku Java lub decimal.Decimal w języku Python.

Zapis JSON
{
  "value": string
}
Pola
value

string

Wartość dziesiętna w formie ciągu znaków.

Reprezentacja w postaci ciągu znaków składa się z opcjonalnego znaku + (U+002B) lub - (U+002D), po którym następuje ciąg składający się z 0 lub większej liczby cyfr dziesiętnych („liczba całkowita”), opcjonalnie po którym następuje ułamek, a opcjonalnie wykładnik. Pusty ciąg znaków należy interpretować jako 0.

Ułamek składa się z kropki dziesiętnej, po której następuje zero lub więcej cyfr dziesiętnych. Ciąg znaków musi zawierać co najmniej 1 cyfrę w części całkowitej lub ułamkowej. Liczba utworzona ze znaku, liczby całkowitej i ułamka jest nazywana mantysą.

Wykładnik potęgi składa się ze znaku e (U+0065) lub E (U+0045), po którym następuje co najmniej 1 cyfra dziesiętna.

Usługi powinny normalizować wartości dziesiętne przed ich zapisaniem, wykonując te czynności:

  • Usunięcie znaku + podanego wprost (+2.5 -> 2.5).
  • Zastąpienie wartości całkowitej o długości zero wartością 0 (.5 -> 0.5).
  • Wymusza użycie wielkiej litery w wykładniku z wyraźnym znakiem (2.5e8 -> 2.5E+8).
  • Usuwanie jawnie podanego wykładnika zerowego (2.5E0 -> 2.5).

Usługi mogą przeprowadzać dodatkową normalizację na podstawie własnych potrzeb i wybranej wewnętrznej implementacji liczb dziesiętnych, np. przesuwać przecinek i wartość wykładnika (przykład: 2.5E-1 <-> 0.25). Usługi mogą też zachowywać zera na końcu części ułamkowej, aby wskazywać większą precyzję, ale nie jest to wymagane.

Pamiętaj, że do oddzielenia części całkowitej od ułamkowej można używać tylko znaku .. Znaku , nie należy używać niezależnie od ustawień regionalnych. Ponadto nie należy obsługiwać separatorów tysięcy. Jeśli usługa je obsługuje, wartości muszą być znormalizowane.

Gramatyka ENBF to:

DecimalString =
  '' | [Sign] Significand [Exponent];

Sign = '+' | '-';

Significand =
  Digits ['.'] [Digits] | [Digits] '.' Digits;

Exponent = ('e' | 'E') [Sign] Digits;

Digits = { '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' };

Usługi powinny wyraźnie dokumentować zakres obsługiwanych wartości, maksymalną obsługiwaną precyzję (całkowitą liczbę cyfr) oraz, w stosownych przypadkach, skalę (liczbę cyfr po przecinku), a także sposób działania w przypadku otrzymania wartości spoza zakresu.

Usługi mogą akceptować wartości przekazywane jako dane wejściowe, nawet jeśli mają one większą precyzję lub skalę niż obsługiwana przez usługę, i powinny zaokrąglać wartość, aby dopasować ją do obsługiwanej skali. Usługa może też zwrócić błąd 400 Bad Request (INVALID_ARGUMENT w gRPC), jeśli precyzja zostałaby utracona.

Usługi powinny zwracać błąd 400 Bad Request (INVALID_ARGUMENT w gRPC), jeśli otrzymają wartość spoza obsługiwanego zakresu.