文字列の変換と書式化

数値変換と、書式化文字列出力のための関数群。

int PyOS_snprintf(char *str, size_t size, const char *format, ...)

Output not more than size bytes to str according to the format string format and the extra arguments. See the Unix man page snprintf(3).

int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va)

Output not more than size bytes to str according to the format string format and the variable argument list va. Unix man page 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 and format != NULL.

もし vsnprintf() のないプラットフォームで、切り捨てを避けるために必要なバッファサイズが size を512バイトより大きく超過していれば、 Python は Py_FatalError() で abort します。

これらの関数の戻り値 (以下では rv とします) は以下の意味を持ちます:

  • When 0 <= rv < size, the output conversion was successful and rv characters were written to str (excluding the trailing '\0' byte at str[rv]).

  • When rv >= size, the output conversion was truncated and a buffer with rv + 1 bytes would have been needed to succeed. str[size-1] is '\0' in this case.

  • When rv < 0, "something bad happened." str[size-1] is '\0' in this case too, but the rest of str is undefined. The exact cause of the error depends on the underlying platform.

以下の関数は locale 非依存な文字列から数値への変換を行ないます。

double PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception)

文字列 sdouble に変換します。失敗したときは Python の例外を発生させます。受け入れられる文字列は、 Python の float() コンストラクタが受け付ける文字列に準拠しますが、 s の先頭と末尾に空白文字があってはならないという部分が異なります。この変換は現在のロケールに依存しません。

endptrNULL の場合、変換は文字列全体に対して行われます。文字列が正しい浮動小数点数の表現になっていない場合は -1.0 を返して ValueError を発生させます。

endptr が NULL で無い場合、文字列を可能な範囲で変換して、*endptr に最初の変換されなかった文字へのポインタを格納します。文字列の先頭に正しい浮動小数点数の表現が無かった場合、*endptr を文字列の先頭に設定して、ValueError を発生させ、-1.0 を返します。

s が float に格納し切れないほど大きい値を表現していた場合、(例えば、"1e500" は多くのプラットフォームで表現できません) overflow_exceptionNULL なら Py_HUGE_VAL に適切な符号を付けて返します。他の場合は overflow_exception は Python の例外オブジェクトへのポインタでなければならず、その例外を発生させて -1.0 を返します。どちらの場合でも、*endptr には変換された値の直後の最初の文字へのポインタが設定されます。

それ以外のエラーが変換中に発生した場合(例えば out-of-memory エラー)、適切な Python の例外を設定して -1.0 を返します。

バージョン 3.1 で追加.

char* PyOS_double_to_string(double val, char format_code, int precision, int flags, int *ptype)

double val を指定された format_code, precision, flags に基づいて文字列に変換します。

format_code'e', 'E', 'f', 'F', 'g', 'G', 'r' のどれかでなければなりません。 'r' の場合、 precision は 0 でなければならず、無視されます。 'r' フォーマットコードは標準の repr() フォーマットを指定しています。

flags は 0 か、 Py_DTSF_SIGN, Py_DTSF_ADD_DOT_0, Py_DTSF_ALT か、これらの or を取ったものです:

  • Py_DTSF_SIGN は、val が負で無いときも常に符号文字を先頭につけることを意味します。

  • Py_DTSF_ADD_DOT_0 は文字列が整数のように見えないことを保証します。

  • Py_DTSF_ALT は "alternate" フォーマットルールを適用することを意味します。 詳細は PyOS_snprintf()'#' 指定を参照してください。

ptypeNULL で無い場合、val が有限数、無限数、NaNのどれかに合わせて、Py_DTST_FINITE, Py_DTST_INFINITE, Py_DTST_NAN のいずれかに設定されます。

戻り値は変換後の文字列が格納された buffer へのポインタか、変換が失敗した場合は NULL です。 呼び出し側は、返された文字列を PyMem_Free() を使って解放する責任があります。

バージョン 3.1 で追加.

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

大文字/小文字を区別しない文字列比較。大文字/小文字を無視する以外は、 strcmp() と同じ動作をします。

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

大文字/小文字を区別しない文字列比較。大文字/小文字を無視する以外は、 strncmp() と同じ動作をします。