在对象级别或应用程序级别使用 setlocale
Using setlocale at object level or at application level
我有一个设置为某个语言环境的Linux系统,它运行着一个c ++应用程序。我可以从 c++ 应用程序或操作系统本身进行std::setlocale(LC_NUMERIC, "en_US.UTF-8")
(通过 /etc/default/locale
更改(。我无法访问主功能,所以我在我的函数中做了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);
}
我的问题是我应该在哪里有效安全地设置区域设置。我的位置值得到逗号而不是点,然后 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
}
我确实找到了解决我问题的东西,但还没有设法让它工作。不确定此链接中的描述是否遵循标准库。
我前段时间给出了一个类似问题的答案,并试图澄清语言环境的问题,所以如果你想了解更多:stod 在 boost::locale 中无法正常工作。简而言之:
-
在插件中调用
std::setlocale
并不是一件好事,因为它是整个应用程序的全局状态,您可能会弄乱应用程序的其他部分。至少您应该在完成后立即重置区域设置。 -
如果使用
std::stream
(stringstream
,cin
,cout
(,则流的区域设置与创建流对象时全局C++区域设置的值匹配。通常它是经典的"C"区域设置。但是没有保证,因为应用程序的某些部分可以像您一样操纵它。 -
您可以通过调用
std::stream::imbue
来确保std::stream
具有所需的区域设置。这只会操纵您的流,而不会操纵全局状态。
例如:
std::stringstream stream;
stream.imbue(std::locale::classic());//classical locale "C" with separator '.'
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 构造对象的歧义
- 在对象级别或应用程序级别使用 setlocale