文字列の変換とフォーマット
数値変換およびフォーマットされた文字列出力のための関数。
- int PyOS_snprintf(char *str, size_t size, const char *format, ...)
- フォーマット文字列 format と追加の引数に従って、 size バイト以下を str に出力します。 Unixのマニュアルページ snprintf(2)を参照してください。
- int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va)
- フォーマット文字列フォーマットと可変引数リスト va に従って、サイズバイト以下を str に出力します。 Unixのマニュアルページ vsnprintf(2)。
PyOS_snprintf()および PyOS_vsnprintf()は、標準Cライブラリ関数snprintf()
およびvsnprintf()
をラップします。 それらの目的は、標準C関数では不可能な、コーナーケースでの一貫した動作を保証することです。
ラッパーは、 str * [* size -1]が戻ったときに常に'\0'
であることを保証します。 size バイト(末尾の'\0'
を含む)を超えるバイトをstrに書き込むことはありません。 どちらの機能でも、str != NULL
、size > 0
、format != NULL
が必要です。
プラットフォームにvsnprintf()
がなく、切り捨てを回避するために必要なバッファーサイズが size を512バイト以上超える場合、Pythonは Py_FatalError で異常終了します。
これらの関数の戻り値( rv )は、次のように解釈する必要があります。
0 <= rv < size
の場合、出力変換は成功し、 rv 文字が str に書き込まれました( str * [の末尾の'\0'
バイトを除く)。 * rv ])。rv >= size
の場合、出力変換は切り捨てられ、成功するにはrv + 1
バイトのバッファーが必要でした。 この場合、 str * [* size -1]は'\0'
です。rv < 0
のとき、「何か悪いことが起こった」。 この場合も str * [* size -1]は'\0'
ですが、残りの str は未定義です。 エラーの正確な原因は、基盤となるプラットフォームによって異なります。
次の関数は、ロケールに依存しない文字列から数値への変換を提供します。
- double PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception)
文字列
s
をdouble
に変換し、失敗するとPython例外を発生させます。 受け入れられる文字列のセットは、Pythonの float()コンストラクターによって受け入れられる文字列のセットに対応します。ただし、s
の先頭または末尾に空白を含めることはできません。 変換は、現在のロケールに依存しません。endptr
がNULL
の場合、文字列全体を変換します。 文字列が浮動小数点数の有効な表現でない場合は、ValueErrorを発生させ、-1.0
を返します。endptrが
NULL
でない場合は、できるだけ多くの文字列を変換し、*endptr
を最初の変換されていない文字を指すように設定します。 文字列の最初のセグメントが浮動小数点数の有効な表現でない場合は、*endptr
を設定して文字列の先頭を指し、ValueErrorを発生させ、-1.0
を返します。s
が大きすぎてフロートに格納できない値を表す場合(たとえば、"1e500"
は多くのプラットフォームでこのような文字列です)、overflow_exception
は [ X155X]はPy_HUGE_VAL
(適切な符号付き)を返し、例外を設定しません。 それ以外の場合、overflow_exception
はPython例外オブジェクトを指している必要があります。 その例外を発生させ、-1.0
を返します。 どちらの場合も、変換された値の後の最初の文字を指すように*endptr
を設定します。変換中に他のエラー(メモリ不足エラーなど)が発生した場合は、適切なPython例外を設定し、
-1.0
を返します。バージョン2.7の新機能。
- double PyOS_ascii_strtod(const char *nptr, char **endptr)
文字列を
double
に変換します。 この関数は、Cロケールでの標準C関数strtod()
と同じように動作します。 スレッドセーフではないため、現在のロケールを変更せずにこれを実行します。PyOS_ascii_strtod()は通常、ロケールに依存しない構成ファイルまたはその他の非ユーザー入力の読み取りに使用する必要があります。
詳細については、Unixのマニュアルページ strtod(2)を参照してください。
バージョン2.4の新機能。
バージョン2.7以降非推奨:代わりに PyOS_string_to_double()を使用してください。
- char *PyOS_ascii_formatd(char *buffer, size_t buf_len, const char *format, double d)
double
を、'.'
を小数点記号として使用して文字列に変換します。 format は、数値フォーマットを指定するprintf()
スタイルのフォーマット文字列です。 使用できる変換文字は、'e'
、'E'
、'f'
、'F'
、'g'
、'G'
です。戻り値は、変換された文字列を含む buffer へのポインタであり、変換が失敗した場合はNULLです。
バージョン2.4の新機能。
バージョン2.7以降非推奨:この関数はPython2.7および3.1で削除されました。 代わりに
PyOS_double_to_string()
を使用してください。
- 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'
、 [のいずれかである必要がありますX95X]または'r'
。'r'
の場合、提供される精度は0
である必要があり、無視されます。'r'
フォーマットコードは、標準の repr()フォーマットを指定します。フラグは、ゼロ個以上の値 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()を呼び出して、返された文字列を解放する責任があります。
バージョン2.7の新機能。
- double PyOS_ascii_atof(const char *nptr)
ロケールに依存しない方法で文字列を
double
に変換します。詳細については、Unixのマニュアルページ atof(2)を参照してください。
バージョン2.4の新機能。
バージョン3.1以降非推奨:代わりに PyOS_string_to_double()を使用してください。
- char *PyOS_stricmp(char *s1, char *s2)
文字列の大文字と小文字を区別しない比較。 この関数は、大文字と小文字を区別しないことを除いて、
strcmp()
とほぼ同じように機能します。バージョン2.6の新機能。
- char *PyOS_strnicmp(char *s1, char *s2, Py_ssize_t size)
文字列の大文字と小文字を区別しない比較。 この関数は、大文字と小文字を区別しないことを除いて、
strncmp()
とほぼ同じように機能します。バージョン2.6の新機能。