gpt4 book ai didi

c++ - 在对象级别或应用程序级别使用 setlocale

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:14:49 24 4
gpt4 key购买 nike

我有一个 Linux 系统,该系统设置为某个语言环境并运行一个 C++ 应用程序。我可以从 C++ 应用程序或操作系统本身执行 std::setlocale(LC_NUMERIC, "en_US.UTF-8")(通过更改 /etc/default/locale).我无权访问 main 函数,所以我在我的函数中执行了 std::setlocale(LC_NUMERIC, "en_US.UTF-8") 并且它工作正常。

但是,我想在我的应用程序中以对象级别或某个全局级别(一次)执行此操作。我在网上看了很多,但没有找到太多帮助,所以决定问问。这是我的 GPS 位置结构

所以,基本上

    //struct Position : std::numpunct<char> {
struct Position {
Position() { isValid = PR_FALSE; lat = 0; lng = 0; elevation = 0; };
PRBool isValid;
double lat;
double lng;
double elevation;
//char do_decimal_point() const { return '.'; } // separate with slash
};

然后,在我的函数中我做了

mycheckposition(){

Position checkPosition;
Position mPosition;
// get some data in above.

double distance;
GetDistanceBetweenWGS84Coords(checkPosition, mPosition, distance);

}

我的问题是我应该在哪里有效且安全地进行 setlocale。我的 Position 值获取逗号而不是点,然后 GetDistanceBetweenWGS84Coords 失败。我系统上的 LC_NUMERIC 代表带小数的数字的逗号。可能是,如果有人想查看 GetDistance 函数,就在这里。

int GetDistanceBetweenWGS84Coords(const Position& from, const 
Position& to, double& distance)
{
const double EARTH_RADIUS_IN_METERS = 6372797.560856;
const double DEG_TO_RAD = 0.017453292519943295769236907684886;

double latitudeArc = (from.lat - to.lat) * DEG_TO_RAD;
double longitudeArc = (from.lng - to.lng) * DEG_TO_RAD;
double latitudeH = sin(latitudeArc * 0.5);
latitudeH *= latitudeH;
double lontitudeH = sin(longitudeArc * 0.5);
lontitudeH *= lontitudeH;
double tmp = cos(from.lat*DEG_TO_RAD) * cos(to.lat*DEG_TO_RAD);

double arcInRadians = 2.0 * asin(sqrt(latitudeH + tmp*lontitudeH));
distance = EARTH_RADIUS_IN_METERS * arcInRadians;

return 0; //success
}

我确实找到了可以解决我的问题的方法,但还没有成功。不确定 this 中是否有描述链接遵循标准库。

最佳答案

我前段时间回答了类似的问题,并试图澄清语言环境的问题,所以如果您想了解更多信息:stod does not work correctly with boost::locale .简而言之:

  1. 在您的插件中调用 std::setlocale 不是一件好事,因为它是整个应用程序的全局状态,您可能会弄乱应用程序的其他部分应用。至少您应该在完成后立即重置语言环境。

  2. 如果您使用 std::stream(stringstreamcincout),那么流的语言环境与创建流对象时全局 C++ 语言环境的值相匹配。通常它是经典的“C”语言环境。但是没有任何保证,因为应用程序的某些部分可以像您一样操纵它。

  3. 您可以通过调用 std::stream::imbue 确保 std::stream 具有理想的语言环境。这只会操纵您的流而不是全局状态。

例如:

std::stringstream stream;
stream.imbue(std::locale::classic());//classical locale "C" with separator '.'

关于c++ - 在对象级别或应用程序级别使用 setlocale,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35180816/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com