質問

私の構文解析GPS状態での応募は固定NMEA文章を、端部の地理的分が常に後ます。しかし、システムロケールを定義カンマとして小数点の区切り atof 機能を無視し期間全体の割合です。

何が最善の方法でそれらを取り扱えるようにしますか?長緯度の文字列に格納される文字配列の場合。

例コード:

m_longitude = atof((char *)pField); 

場所

pField[] = "01000.3897"; 

クロスプラットフォームプロジェクト編のためのWindows XPおよびCE.

コメントソリューション:

受け答えはよりエレガントが この 回答やコメントも知ることとしては修正

役に立ちましたか?

解決

きは常に使用moduloエラーチェック):

#include <sstream>
...

float longitude = 0.0f;
std::istringstream istr(pField);

istr >> longitude;

標準iostreams軒のグローバルロケールによるデフォルトするときに初期化され、クラシック(米国)locale).このように上記は一般的な人前のグローバルロケールになっても、他のもの場合でも、走っ非英語ます。んだことを希望するロケールを使用し、特定のロケールの"心"のストリームとロケールの前からの読み出し:

#include <sstream>
#include <locale>

...
float longitude = 0.0f;
std::istringstream istr(pField);

istr.imbue(std::locale("C"));
istr >> longitude;

どん使う正規表現検証NMEA分野の異なる部品の分野として捉え、その後の変換は、異なるパーツを使用して上記の方法です。の前の部分の小数点、NMEA経度分野で実際にスマートフォンとして"DDDMM.mmm.."がDDDに対応し、MM.mmm分がでしょうが、すでに知っています。

他のヒント

厄解し、一度は sprintf() 0.0fかの二文字から出力されます。そして、入力文字列置き換え'.'による文字です。この解決のカンマで区切る場合がればロケールを設定小数分離機。

の他理由をすることができません setlocale "C"以前のatof回復することロケール。か誤解の...

また繰り返し処理を実行し、すべての文字配列の、スワップ以外に任意の数字 . 文字、すべての座標に number-single_delimiter_character_-number 形式です。

いの必要はなロケールの挙動を併記?ない場合

setlocale(LC_ALL|~LC_NUMERIC, "");

あるいはそれと同等の利用std::ロケールのコンストラクタです。

一部のソリューション上のものではないと考えられるが、いを提案し、このことを完全にfailproofます。でコピー-貼り付けるこの機能を使用します。

float stor(const char* str) {
    float result = 0;
    float sign = *str == '-' ? str++, -1 : 1;
    while (*str >= '0' && *str <= '9') {
        result *= 10;
        result += *str - '0';
        str++;
    }
    if (*str == ',' || *str == '.') {
        str++;
        float multiplier = 0.1;
        while (*str >= '0' && *str <= '9') {
            result += (*str - '0') * multiplier;
            multiplier /= 10;
            str++;
        }
    }
    result *= sign;
    if (*str == 'e' || *str == 'E') {
        str++;
        float powerer = *str == '-'? str++, 0.1 : 10;
        float power = 0;
        while (*str >= '0' && *str <= '9') {
            power *= 10;
            power += *str - '0';
            str++;
        }
        result *= pow(powerer, power);
    }
    return result;
}

今、最も単純な回答をいうを利用するのバージョン atof() るCロケールのパラメータ:

_locale_t plocale = _create_locale( LC_ALL, "C" );

double result = _atof_l( "01000.3897", plocale );

_free_locale( plocale );

を作成することはできな混乱ストのログインロケール、または操作文字列のです。を作成し、ご希望のロケールのオブジェクトな全ての処理を無料ででき終了しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top