2

に浮動小数点数がありchar[]ます。DEまたはPLローカライズされた文字列であり、小数点としてはありません',''.'そのような文字列をフロートに変換する標準的な方法はありますか? 「 を . に置き換えて使用する」よりも優れたものを探していますatoi

4

2 に答える 2

3

@Omkantが示唆しstrtod()たように、あなたのために行います:

setlocale(LC_NUMERIC, "de_DE.UTF-8");
errno = 0;
val = strtod(myString, &endPtr);
if (errno)
{
    // Handle error
}
if (*endPtr)
{
    // This tells you that the string had a trail, e.g. "250.99USD"
}

&endPtr の代わりに NULL を使用できます。ゼロを変換しようとしないことが確実な場合はval、設定する代わりにゼロを使用してエラーをチェックできerrnoます。

// Faster, sloppier version
setlocale(LC_NUMERIC, "de_DE.UTF-8");
if (!(val = strtod(myString, NULL)))
{
    // An error occurred, provided myString was not legitimately zero
    // AND is not so large a value as to create overflow.
}

一部のコンテキストでは、16 進数などの代替数値形式を受け入れることができるため、わずかに高価なsscanfの方が適しています。strtod場合によっては、3.14159 などの「適切な」浮動小数点ではないものを変換段階を通過させたくない場合があります。strtod()許可します。

また、 "INFERIOR" などの文字列strtod()を受け入れます (ずさんなバージョンでは検出しません) (これは ERIOR の末尾を持つ INfinity として解釈されます)。可能性は高くありませんが、状況によっては、値がユーザーの制御下にある場合、アプリケーションの脆弱性につながる可能性があります。

于 2012-12-15T09:17:41.360 に答える
2

私の知る限り、 sscanf(3)strtod(3 )の両方がロケールを処理する必要があります。その前に適切にsetlocale(3)を呼び出してください。

于 2012-12-15T08:54:15.757 に答える