# Перетворення та форматування рядків

Функції для перетворення чисел і виведення форматованого рядка.

int PyOS_snprintf(char *str, size_t size, const char *format, ...)
  Part of the Stable ABI.

  Виводити не більше size байтів до str відповідно до рядка формату format і додаткових аргументів. Перегляньте сторінку довідки Unix snprintf(3).

int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va)
  Part of the Stable ABI.

  Виводити не більше size байтів до str відповідно до рядка формату format і списку змінних аргументів va. Довідкова сторінка Unix vsnprintf(3).

`PyOS_snprintf()` і `PyOS_vsnprintf()` обгортають стандартні функції бібліотеки C `snprintf()` і `vsnprintf()`. Їх мета полягає в тому, щоб гарантувати послідовну поведінку в кутових випадках, чого немає у стандартних функціях C.

The wrappers ensure that `str[size-1]` is always `'\0'` upon return. They never write more than size bytes (including the trailing `'\0'`) into str. Both functions require that `str != NULL`, `size > 0`, `format != NULL` and `size < INT_MAX`. Note that this means there is no equivalent to the C99 `n = snprintf(NULL, 0, ...)` which would determine the necessary buffer size.

Повернене значення (rv) для цих функцій слід інтерпретувати таким чином:

- Коли `0 <= rv < size`, вихідне перетворення було успішним і rv символи були записані в str (за винятком кінцевого байта `'\0''` у `str[rv]` ).

- Коли rv >= size, вихідне перетворення було скорочено, і для успіху знадобився буфер із rv + 1 байтами. `str[size-1]` у цьому випадку є `'\0''`.

- Коли `rv < 0`, «сталося щось погане». `str[size-1]` у цьому випадку також є `'\0''`, але решта str не визначена. Точна причина помилки залежить від основної платформи.

Наступні функції забезпечують перетворення рядка в число, незалежне від локалі.

unsigned long PyOS_strtoul(const char *str, char **ptr, int base)
  Part of the Stable ABI.

  Convert the initial part of the string in `str` to an unsigned long value according to the given `base`, which must be between `2` and `36` inclusive, or be the special value `0`.

  Leading white space and case of characters are ignored. If `base` is zero it looks for a leading `0b`, `0o` or `0x` to tell which base. If these are absent it defaults to `10`. Base must be 0 or between 2 and 36 (inclusive). If `ptr` is non-`NULL` it will contain a pointer to the end of the scan.

  If the converted value falls out of range of corresponding return type, range error occurs (`errno` is set to `ERANGE`) and `ULONG_MAX` is returned. If no conversion can be performed, `0` is returned.

  See also the Unix man page strtoul(3).

  Нове в версії 3.2.

long PyOS_strtol(const char *str, char **ptr, int base)
  Part of the Stable ABI.

  Convert the initial part of the string in `str` to an long value according to the given `base`, which must be between `2` and `36` inclusive, or be the special value `0`.

  Same as `PyOS_strtoul()`, but return a long value instead and `LONG_MAX` on overflows.

  See also the Unix man page strtol(3).

  Нове в версії 3.2.

double PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception)
  Part of the Stable ABI.

  Convert a string `s` to a double, raising a Python exception on failure. The set of accepted strings corresponds to the set of strings accepted by Python’s `float()` constructor, except that `s` must not have leading or trailing whitespace. The conversion is independent of the current locale.

  Якщо `endptr` має значення `NULL`, перетворити весь рядок. Викликайте `ValueError` і повертайте `-1.0`, якщо рядок не є дійсним представленням числа з плаваючою комою.

  Якщо endptr не дорівнює NULL, перетворіть якомога більшу частину рядка та встановіть `*endptr` так, щоб він вказував на перший неперетворений символ. Якщо жоден початковий сегмент рядка не є дійсним представленням числа з плаваючою комою, установіть `*endptr`, щоб вказувати на початок рядка, викликайте ValueError і поверніть `-1.0`.

  Якщо `s` представляє значення, яке є надто великим для зберігання в float (наприклад, `"1e500"` є таким рядком на багатьох платформах), тоді `overflow_exception` має значення `NULL` поверніть `Py_HUGE_VAL` (з відповідним знаком) і не встановлюйте винятків. В іншому випадку `overflow_exception` має вказувати на об’єкт винятку Python; викликати цей виняток і повернути `-1.0`. В обох випадках встановіть `*endptr`, щоб вказувати на перший символ після перетвореного значення.

  Якщо під час перетворення виникає будь-яка інша помилка (наприклад, помилка браку пам’яті), установіть відповідний виняток Python і поверніть `-1.0`.

  Нове в версії 3.1.

char *PyOS_double_to_string(double val, char format_code, int precision, int flags, int *ptype)
  Part of the Stable ABI.

  Convert a double val to a string using supplied format_code, precision, and flags.

  format_code має бути одним із `'e'`, `'E'`, `'f'`, `'F'`, `'g'`, `'G'` або `'r''`. Для `'r'` надана точність має бути 0 і ігнорується. Код формату `'r'` визначає стандартний формат `repr()`.

  flags може мати нуль або більше значень `Py_DTSF_SIGN`, `Py_DTSF_ADD_DOT_0` або `Py_DTSF_ALT`, або об’єднані разом:

  - `Py_DTSF_SIGN` означає, що перед поверненим рядком завжди ставиться знак, навіть якщо val є невід’ємним.

  - `Py_DTSF_ADD_DOT_0` означає, що повернутий рядок не буде виглядати як ціле число.

  - `Py_DTSF_ALT` означає застосування «альтернативних» правил форматування. Перегляньте документацію для специфікатора `PyOS_snprintf()` `'#''` для отримання детальної інформації.

  Якщо ptype не є `NULL`, тоді значення, на яке він вказує, буде встановлено на одне з `Py_DTST_FINITE`, `Py_DTST_INFINITE` або `Py_DTST_NAN`, що означає, що val є кінцеве число, нескінченне число або не число відповідно.

  Поверненим значенням є вказівник на buffer із перетвореним рядком або `NULL`, якщо перетворення не вдалося. Виклик відповідає за звільнення повернутого рядка шляхом виклику `PyMem_Free()`.

  Нове в версії 3.1.

int PyOS_stricmp(const char *s1, const char *s2)

  Case insensitive comparison of strings. The function works almost identically to `strcmp()` except that it ignores the case.

int PyOS_strnicmp(const char *s1, const char *s2, Py_ssize_t size)

  Case insensitive comparison of strings. The function works almost identically to `strncmp()` except that it ignores the case.