• [^] # Re: info

    Posté par . En réponse au message [Résolu] Problème de séparateur décimal. Évalué à 0. Dernière modification le 15 octobre 2013 à 19:34.

    C'est moi qui parse la valeur, à coup de strtof() (parce que les strtoX() sont les seules méthodes qui permettent de vérifier que ce que l'on a obtenu est correct (sans avoir à sortir l'artillerie lourde, genre boost::lexical_cast)).

    Du coup, j'ai tenté de vérifier ma locale juste avant l'appel à strtof().

    D'après http://www.cplusplus.com/reference/locale/locale/locale/, en C++ :
    std::locale g = std::locale(); est sensé me donner ma locale globale (pas certain de ce que cela signifie),
    std::locale d = std::locale(""); est sensé me donner la locale par défaut du système,
    std::use_facet< std::numpunct >(la_locale).decimal_point(); est sensé me donner le séparateur décimal.

    Sur les deux machines, la locale par défaut est C avec comme séparateur décimal est le point, et la locale globale est bien fr_FR.UTF-8 avec la virgule. Mais je ne suis pas certain de savoir laquelle est utilisée...

    Sauf qu'à priori, comme strtof() est une fonction C et non C++, elle utilise une autre locale.
    D'après http://www.cplusplus.com/reference/clocale/localeconv/, les lignes suivantes me donne le séparateur décimal :

    struct lconv * lc = localeconv();
    std::cout << lc->decimal_point << std::endl;

    Sur ma machine virtuelle, c'est bien le point. Sur le serveur, c'est la virgule. Ce qui explique le comportement du serveur. Reste à trouver pourquoi il utilise une locale différente. Moi qui avait pris une LTS en pensant être tranquille...

    Je pense qu'en attendant, je vais changer pour du lexical_cast.